Java Swing: Подход для того, чтобы динамично добавить текст в текстовой области, имейте обновление полосы прокрутки

введите текущий рабочий каталог и удалите файлы с именами «socket.py» и «socket.pyc»

5
задан Berlin Brown 11 June 2009 в 20:33
поделиться

4 ответа

Используйте append () , чтобы добавить текст, затем setCaretPosition () , чтобы убедиться, что вы прокручиваете вместе с ним.

myTextPane.append(textFromSomewhere);
myTextPane.setCaretPosition(myTextPane.getDocument().getLength());
13
ответ дан 18 December 2019 в 06:23
поделиться

Метод append () не делает того, что вы хотите?

И хотя вы не спрашивали: когда вы генерируете что-то в фоновом потоке, обязательно используйте SwingUtilities .invokeLater () для обновления компонентов.

7
ответ дан 18 December 2019 в 06:23
поделиться

Из другого потока вы должны использовать 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. Если он был перемещен, то мы, вероятно, не хотим обновлять его после добавления.

Примечание: если это делают несколько потоков, вы не обязательно знаете, какой из них попадет первым.

3
ответ дан 18 December 2019 в 06:23
поделиться

Если вы обновляетесь из потока, не забудьте использовать SwingWorker или какой-либо другой подход, безопасный для потоков AWT.

1
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: