2009-06-11 8 views
5

자바 스윙의 일반적인 접근 방식으로 텍스트 영역을 텍스트 줄 (예 : 스레드)로 업데이트 한 다음 텍스트 캐럿이 아래쪽으로 흐르게하십시오 textarea가 텍스트로 추가됩니다. 또한 스크롤 막대가 바닥에 있도록 업데이트하십시오.Java Swing : 텍스트 영역에 텍스트를 동적으로 추가하고 스크롤바 업데이트

나는 stringbuffer를 가지고 거기에 텍스트를 추가 한 다음 텍스트 영역에 문자열을 설정하고 스크롤바의 아래쪽에 위치시킬 것이라고 생각했다.

답변

13

append()을 사용하여 텍스트를 추가 한 다음 setCaretPosition()을 사용하여 스크롤해야합니다.

myTextPane.append(textFromSomewhere); 
myTextPane.setCaretPosition(myTextPane.getDocument().getLength()); 
+0

+1 커서를 이동하기 위해 기억을 위해 (이후, 톰 Hawtin의에서 코드를 호출에 랩) – kdgregory

+0

길이를 얻기 위해 전체 텍스트 영역을 문자열로 복사합니까? 이것은 스레드로부터 안전하지 않습니다. –

+0

예, 표준 스윙 스레딩 절차가 적용됩니다. (나는 getText()가 일을 복사하는 것을 인식하지 못했습니다. getDocument()로 바꿀 것입니다.) –

7

append() 메소드가 원하는 것을 수행하지 못합니까?

그리고 백그라운드 스레드에서 무언가를 생성 할 때 SwingUtilities.invokeLater()를 사용하여 구성 요소를 업데이트해야합니다.

1

당신이 스레드에서 업데이트하는 경우, SwingWorker 또는 다른 AWT 스레드 안전 접근 방법을 사용하는 것을 잊지 말아.

3

EDT를 사용하려면 다른 스레드에서 java.awt.EventQueue.invokeLater을 사용해야하며 모든 것이 작동합니다. 그래서

:

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { 
    Document doc = text.getDocument(); 
    int origLen = doc.getLength() 
    try { 
     doc.insertString(origLen, msg, null); 
    } catch (BadLocationException exc) { 
     // Odd APIs forces us to deal with this nonsense. 
     IndexOutOfBoundsException wrapExc = new IndexOutOfBoundsException(); 
     wrapExc.initCause(exc); 
     throw wrapExc; 
    } 
    // IIRC, Position is a bit odd and 
    if (origLen == 0) { 
     text.setCaretPosition(doc.getLength()); 
    } 
}}); 

누구는 스레드 안전하다고 주장 JTextArea.append의 API 문서를 읽어야한다. JDK7은 그러한 희귀 한 주장을 제거합니다 (알림 : 스레딩은 어렵습니다). 일반적으로 Swing에서는 모델/Document에 대해 항상 직진하는 경향이 있습니다.

캐럿이 끝에 있으면 추가 후 이동해야한다고 생각합니다. 유일한 예외는 이상한 API 때문에 텍스트가없는 경우입니다. 이동 된 경우에는 추가 한 후에 업데이트하지 않을 것입니다.

참고 : 여러 스레드가이 작업을 수행하는 경우 반드시 먼저 처리 할 스레드가 무엇인지 알 필요가 없습니다.

당신이 doc.length을 읽지 않고 스크롤을 업데이트 할 수 있습니다
1

:

scrollbar.setValue(scrollbar.getMaximum()); 

업데이트

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { 
    try { 
     textArea.append(msg); 
    } catch (BadLocationException exc) { 
     // Odd APIs forces us to deal with this nonsense. 
     IndexOutOfBoundsException wrapExc = new IndexOutOfBoundsException(); 
     wrapExc.initCause(exc); 
     throw wrapExc; 
    } 
    JScrollBar bar = scrollPane.getVerticalScrollBar(); 
    bar.setValue(bar.getMaximum()); 
}}); 
+0

그리고 invokeLater로 래핑 해주세요. 대답을 업데이트하십시오. – mKorbel

+0

저는이 스레드 안전 문제에 정말로 관심이 없지만, 이것이 무엇을 원했는지 기대하고 있습니다. – fachexot

관련 문제