2010-03-14 6 views
4

JScrollPane 안에 JEditorPane을 갖고 싶습니다. 사용자가 버튼을 클릭하면 클릭 수신기는 jScrollpane.setViewPort (textEditor)를 호출하고 textEditor.setText (String)을 호출하여 편집 가능한 텍스트로 채우고 jscrollpane.getVerticalScrollBar(). setValue (0)를 호출하여 textEditor를 만듭니다. 궁금한 점이 있으시면, setText()는 topicView가 아닌 ​​이유로 setViewPort() 뒤에 와야합니다.JScrollPane는 JEditorPane의 긴 텍스트로 스크롤을 내림

문제는 다음과 같습니다. 사용자가 버튼을 클릭하면 JScrollPane의보기가 맨 아래로 스크롤됩니다. 내 클릭 청취자의 마지막 줄에 따라 스크롤바가 맨 위에 오길 원합니다.

나는 디버거를 열었고, 필터를 펌핑 할 때 jscrollpane의 뷰포트가 클릭 수신기가 끝난 후 맨 아래로 내려가는 것을 발견했다. Swing이 clicklistener가 끝날 때까지 editor/jscrollpane의 채우기를 지연시키고 있지만 scrollbar 명령을 먼저 호출하는 것 같습니다. 따라서 바람직하지 않은 동작입니다.

어쨌든 깨끗한 솔루션이 있는지 궁금합니다. 수정 후에 스크롤바를 스크롤하여 상단으로 스크롤하는 것이 합리적으로 공통적 인 요구 사항 인 것처럼 보이기 때문에 이것이 잘 해결 된 문제라고 가정합니다.

감사합니다.

답변

1

좋아, 게시 후 응답의 1 분수를 항상 계산하는 방법에 놀란다.

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     pane.getVerticalScrollBar().setValue(0); 
    } 
}); 

이것은 스크롤 작업이 다른 작업이 완료 될 때까지 지연 될 수 있습니다. 질문 :이 좋은 스타일/신뢰성 또는 그냥 경주 조건입니까? 이 작업에 의존 할 수 있습니까?

+0

@ Konrad Garus '아이디어가 더 좋지만 EDT의 작업은 프로그램 순서로 진행됩니다. http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html – trashgod

+0

나는 invokeLater를 사용하는 솔루션을 피할 것이지만 일반적으로 더 좋은 방법이 있습니다. 예를 들어, 나중에 호출하는 한 가지 단점은 invokeLater를 설정하고 실제로 실행 한 후에 다시 칠할 수 있다는 것입니다. 구성 요소의 모양이 변경되면 화면에 깜박임이 발생할 수 있습니다. – Keilly

4

JEditorPane.setCaretPosition(0)을 사용할 수 있습니다.

관련 문제