С другой стороны, вы должны использовать 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. Если он был перемещен, мы, вероятно, не захотим его обновлять после добавления.
Примечание: Если это связано с несколькими потоками, вы не обязательно знаете, что будет там первым.
+1 для запоминания, чтобы переместить курсор – kdgregory
Копирование всей текстовой области в строку только для того, чтобы получить длину? Это не будет потокобезопасным. –
Да, применяются стандартные процедуры намотки. (Я не понимал, что getText() задействовал копирование вещей, я изменил это на getDocument().) –