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 хорошо подходит, например, для индикаторов выполнения.