Da un altro thread, è necessario utilizzare java.awt.EventQueue.invokeLater
per accedere all'EDT e quindi tutto funziona.
Quindi:
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());
}
}});
Se qualcuno di leggere la documentazione API per JTextArea.append
che dice di essere thread-safe. JDK7 rimuove questa affermazione improbabile (promemoria: il threading è difficile). Di norma, in Swing tendo ad andare sempre dritto per il modello/Document
.
Credo che se il cursore è alla fine dovrebbe essere spostato dopo un'appendice. L'unica eccezione è se non c'è testo, a causa della strana API. Se è stato spostato, probabilmente non vogliamo aggiornarlo dopo l'aggiunta.
Nota: se più thread stanno facendo questo, non si sa necessariamente quale sarà il primo.
fonte
2009-06-11 22:25:18
+1 per ricordare per spostare il cursore – kdgregory
Copia l'intera area di testo in una stringa solo per ottenere la lunghezza? Questo non sarà sicuro per i thread. –
Sì, si applicano le procedure di filettatura Swing standard. (Non mi sono reso conto che getText() implicava la copia di cose, lo cambierò in getDocument()). –