введите текущий рабочий каталог и удалите файлы с именами «socket.py» и «socket.pyc»
Используйте append ()
, чтобы добавить текст, затем setCaretPosition ()
, чтобы убедиться, что вы прокручиваете вместе с ним.
myTextPane.append(textFromSomewhere);
myTextPane.setCaretPosition(myTextPane.getDocument().getLength());
Метод append () не делает того, что вы хотите?
И хотя вы не спрашивали: когда вы генерируете что-то в фоновом потоке, обязательно используйте SwingUtilities .invokeLater () для обновления компонентов.
Из другого потока вы должны использовать 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. Если он был перемещен, то мы, вероятно, не хотим обновлять его после добавления.
Примечание: если это делают несколько потоков, вы не обязательно знаете, какой из них попадет первым.
Если вы обновляетесь из потока, не забудьте использовать SwingWorker
или какой-либо другой подход, безопасный для потоков AWT.