Java Swingworker: не как инкапсулированный класс - PullRequest
3 голосов
/ 24 апреля 2010

У меня проблемы с передачей информации, обновлением прогресса и указанием «выполнено» с классом SwingWorker, который не является инкапсулированным классом .

У меня есть простой класс, который обрабатывает файлы и каталоги на жестком диске. Пользователь нажимает кнопку «Пуск», и он запускает экземпляр SwingWorker.

Я хотел бы напечатать имена файлов, которые обрабатываются на JTextArea в потоке, управляемом событиями, из SwingWorker в качестве обновления индикатора выполнения. Все примеры в Интернете предназначены для вложенного класса, а вложенный класс обращается к переменным во внешнем классе (например, метод done). Я также хотел бы сообщить потоку, управляемому событиями, о завершении SwingWorker, чтобы EDT мог выполнять такие действия, как включение кнопки «Пуск» (и очистка полей).

Вот мои вопросы: 1. Как класс SwingWorker помещает текст в JTextArea потока, управляемого событиями, и обновляет индикатор выполнения?

  1. Как EDT определяет, когда закончится { внешний } поток SwingWorker?

{ Я не хочу SwingWorker как вложенный класс, потому что много кода (и обработки) сделано. }

1 Ответ

2 голосов
/ 24 апреля 2010

A SwingWorker по-прежнему является классом, который вы можете расширять и передавать в любую информацию, необходимую для выполнения своей работы, независимо от того, инкапсулирован ли он в другом классе.Таким образом, вы можете передать JTextArea как «целевую текстовую область» в конструкторе, сохранить ее как переменную-член, а затем обновить текстовую область в методе process(List<V>).

EDT не '• определить, когда работник закончил: сам работник знает, что он завершил свою работу, потому что метод doInBackground() завершается.Код, который завершает рабочий, обнаруживает завершение doInBackground(), а затем вызывает метод done() в EDT.(Возможность работника Swing автоматически обрабатывать все изменения в потоках для вас - одна из вещей, которая делает его таким хорошим.)

В вашей реализации done() вы можете сообщить своему GUI о завершении, вызвавобратно через объект-наблюдатель - снова то, что вы могли бы передать конструктору работника.

См. это руководство в SwingWorker для описания того, как препятствовать различным методам.След по индикаторам выполнения включает в себя раздел об использовании индикатора выполнения у свингера.

...