2013-02-13 4 views
7

У меня есть рабочий качания, который вычисляет в фоновом режиме, обновляя progressBar в JFrame.Как дождаться завершения SwingWorker?

Как я могу сделать свой основной поток для завершения doInBackground()?

Я знаю, что могу поместить вещи в метод done(), но мне было интересно, есть ли способ заставить программу ждать (этот поток, чтобы быть прав).

Нечто похожее на то, что сделает модальный JDialog.

Итак ...

SwingWorker a = new SwingWorker(); 
a.execute 

doOtherStuff(); 

doOtherStuff побежал только после того, как doInBackground завершено, но без сдачи указанного метода в методе делается() из SwingWorker.

+0

SwingWorker представляет собой «асинхронный» операцию. С этой парадигмой «следующая» вещь должна быть обработана в обратном вызове - в противном случае использование ее в качестве асинхронного источника событий мало покупает. JDialogs - это ужасные хаки. Не то, что я бы рекомендовал попробовать подражать. – 2013-02-13 03:44:31

ответ

9

Короткий ответ: да.

SwingWorker#get будет блокировать до doInBackground метод возвращается.

Долгий ответ, вероятно, не то, что вы хотите сделать.

Если вы запускаете SwingWorker из EDT и вызов SwingWorker#get вы будете блокировать EDT, предотвращая его обработки каких-либо обновлений, что приводит вас к той причине, почему вы используете SwingWorker.

В этом случае у вас есть два варианта. Вы могли бы предоставить SwingWorker интерфейс обратного вызова, который он мог бы позвонить с done после завершения SwingWorker. Или вы можете прикрепить PropertyChangeListener к SwingWorker и контролировать значение state, ожидая, пока она не равна StateValue.Done

Смежные вопросы