Как правило, любые обновления, которые вы делаете с Swing, и, в частности, все, что меняет состояние или компоновку элемента управления, должно выполняться из потока Swing.
В этом случае вы абсолютно правы, поэтому каждое обновление в invokeLater
является правильным способом. Вы можете попробовать обновить свою собственную очередь или подобное, но когда Swing уже предоставил только необходимую вам функциональность, имеет смысл использовать его.
См JTextArea
документацию: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html
Где он говорит
Внимание: свинг не поточно. Для получения дополнительной информации см. Политику Swing Threading.
Где он говорит:
В общем свинг не поточно. Все компоненты Swing и связанные классы, если не указано иное, должны быть доступны в потоке диспетчеризации событий.
Метод JTextArea#append
не имеет ничего документированного в нем, говорящего, что он безопасен для использования с другими потоками.
Вызов 'JTextArea # append (...)' должен быть поставлен в очередь на поток событий Swing, чтобы работать безопаснее и лучше. –
Подход, который у вас есть, - хорошее начало. Вопрос в том, в каком порядке происходят обновления? Если да, то у вас большая проблема на ваших руках;) – MadProgrammer
На самом деле нет. У меня есть противоположный вопрос: вы имеете в виду порядок раскачки свинг или порядок вызова метода? Метод имеет счетчик, и он маркирует сообщения (журналы). Но вы имеете в виду, что Swing может отображать нумерованные сообщения в неправильном порядке? Итак, следует ли использовать такой обертку? – Luo