java SwingWorker.doInBackground() не должен обращаться к элементам графического интерфейса

Может быть, это тривиально, я пытаюсь понять простую документацию по SwingWorker.

Вот копия вставленного контента

Workflow

В жизненный цикл SwingWorker входят три потока:

Текущий поток: метод execute() вызывается в этом потоке. Он планирует SwingWorker для выполнения в рабочем потоке и немедленно возвращается. Можно дождаться завершения SwingWorker, используя методы get.

Рабочий поток: метод doInBackground() вызывается в этом потоке. Это где все фоновые действия должны произойти. Чтобы уведомить PropertyChangeListeners об изменениях связанных свойств, используйте методы firePropertyChange и getPropertyChangeSupport(). По умолчанию доступно два связанных свойства: состояние и прогресс.

Поток отправки событий: все связанные с Swing действия происходят в этом потоке. SwingWorker вызывает методы process и done() и уведомляет любые PropertyChangeListeners в этом потоке.

Зачастую текущий поток является потоком отправки событий.

-

Рабочий поток не является EDT, поэтому код в doInBackground() не должен иметь доступа к элементам GUI. Правильно ли мое понимание?

Справочная информация: у нас есть небольшой код, который использует SwingWorker, но имеет doInBackground() для создания FileChooser и вызова setCurrentDirectory(), Я подозреваю, что это приводит меня к исключению почти так же, как http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 (11-Закрыто, не дефект)

1 ответ

Решение

Да. Из фонового потока - как обычные темы, так и SwingWorker.doInBackground Вы не должны изменять пользовательский интерфейс, чтобы избежать различных проблем.

Вместо этого, оберните изменения в Runnable и выполнить их в EDT через SwingUtilities.invokeAndWait, SwingUtilities.invokeLater или - при использовании SwingWorker - с помощью publish (от doInBackground). В пределах process метод SwingWorker, который выполняется EDT, вы можете получить доступ к GUI.

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Лично я нахожу invokeLater а также invokeAndWait проще в использовании во многих ситуациях. SwingWorker хорошо подходит, например, для индикаторов выполнения.

Другие вопросы по тегам