Из другого потока вы должны использовать java.awt.EventQueue.invokeLater
, чтобы войти в EDT, и тогда все работает.
Итак:
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());
}
}});
Если кто-нибудь прочитает документацию по API для JTextArea.append
, он заявляет, что является поточно-ориентированным. JDK7 удаляет эту маловероятную претензию (напоминание: многопоточность трудна). Как правило, в Swing я склонен всегда идти прямо к модели / Document
.
Я считаю, что если каретка в конце, она должна быть перенесена после добавления. Единственное исключение, если нет текста, из-за странного API. Если он был перемещен, то мы, вероятно, не хотим обновлять его после добавления.
Примечание: если несколько потоков делают это, вы не обязательно знаете, что получится первым.