문제

나는 jscrollpane에 jtextArea를 포함 시켰으며 해당 JTextArea를 출력에 사용하고 있습니다.

OUPUT가 jtextArea의 크기를 넘어선 때마다 JtextArea가 자동으로 스크롤하여 사용자가 최근 출력을보기 위해 수동 스크롤을 수행 할 필요가 없습니다.

어떻게 할 수 있습니까?

나는 이미 JtextArea와 Jscrollpane의 Autoscroll 속성을 True로 설정했습니다.

도움이 되었습니까?

해결책

JDK1.4.2 (또는 이전)를 사용하는 경우 포럼에서 찾을 수있는 가장 일반적인 제안은 다음과 같은 코드를 사용하는 것입니다.

textArea.append(...);
textArea.setCaretPosition(textArea.getDocument().getLength());

그러나 JDK5 에서이 문제는 실제로 API 변경으로 해결되었다는 것을 알았습니다. 이제 텍스트 영역의 기본 카레에 속성을 설정 하여이 동작을 제어 할 수 있습니다. 이 접근법을 사용하여 코드는 다음과 같습니다.

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

메모:

CARET 업데이트 정책을 설정하기위한 위의 제안은 작동하지 않습니다.

대신 체크 아웃하고 싶을 수도 있습니다 스마트 스크롤 이는 사용자가 스크롤이 자동이어야하는시기를 결정할 수있는 기능을 제공합니다.

텍스트 영역에서 자동 스크롤에 대한 자세한 설명은 다음과 같습니다. 텍스트 영역 스크롤

다른 팁

    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

JtextArea를 통해 어디에서나 클릭하면 자동 스크롤링이 중지 될 수 있습니다. 간병의 위치가 한 번 변경되었으므로보기 점도 변경되었습니다. 이 시간에 텍스트를 추가하거나 추가 할 때 간병 위치를 설정해야합니다. 도중에, 나는 Set Caret 위치를 포함한 방법을 만들고 추가하거나 추가 할 때 사용합니다.

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

나는 대부분의 제안을 시도했지만 jtextArea의 내용이 커질 때 (여러 MB) 문제가 발생했습니다. 마지막으로 다음은 최고의 성능을 보여주었습니다.

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

물론, 사용자가 선택한 모든 선택은 손실됩니다. 따라서 텍스트 영역의 "디스플레이 전용"사용에 대해서만 사용할 수 있습니다.

그럼에도 불구하고, 내 설치에서 JtextArea의 내용이 약 9MB를 초과하면 사용할 수 없게됩니다 (거의 얼어 붙은 GUI에 매우 부진).

유사한 현상은 텍스트에 UTF-16 인코딩 (소위 대리자 쌍, 다음과 같은 대리자 쌍)에서 두 숯 (2 개의 16 비트 단위)으로 표시되는 문자가 포함되어있을 때 발생합니다. 필터링 솔루션이 있지만 다른 주제 일 수도 있습니다.

대신 이것을 사용하십시오

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

이 시도:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top