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

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

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

Workflow

В жизненном цикле SwingWorker участвуют три потока:

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

Рабочий поток: метод 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 Ответ

11 голосов
/ 24 января 2012

Да.Из фонового потока - как обычных потоков, так и 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 подходит, например, для индикаторов выполнения.

...