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 커서를 이동하기 위해 기억을 위해 (이후, 톰 Hawtin의에서 코드를 호출에 랩) – kdgregory
길이를 얻기 위해 전체 텍스트 영역을 문자열로 복사합니까? 이것은 스레드로부터 안전하지 않습니다. –
예, 표준 스윙 스레딩 절차가 적용됩니다. (나는 getText()가 일을 복사하는 것을 인식하지 못했습니다. getDocument()로 바꿀 것입니다.) –