2013-02-13 15 views
7

Mam pracownika swing, który oblicza w tle, podczas aktualizowania progressBar w JFrame.Jak czekać na zakończenie SwingWorker?

Jak mogę sprawić, aby główny wątek czekał na zakończenie funkcji doInBackground()?

Wiem, że mogę umieścić rzeczy w zrobione() metoda, ale zastanawiałem się, czy istnieje sposób, aby rzeczywiście czekać program (ten wątek, aby być poprawnym).

Coś podobnego do tego, co zrobiłby modalny JDialog.

Więc ...

SwingWorker a = new SwingWorker(); 
a.execute 

doOtherStuff(); 

doOtherStuff jest prowadzony tylko po doInBackground jest kompletna, ale bez narażania wspomnianą metodę w sposób zrobić() z SwingWorker.

+0

SwingWorker reprezentuje „asynchroniczny” operację. Przy takim paradygmacie "następna" rzecz powinna być obsługiwana w oddzwanianiu - w przeciwnym razie użycie jej jako asynchronicznego źródła zdarzeń niewiele kosztuje. JDialogi to straszne hacki ... nie jest to coś, co polecałbym próbować naśladować. –

Odpowiedz

9

Krótka odpowiedź brzmi: tak.

SwingWorker#get będzie blokować aż do zwrócenia metody doInBackground.

Długa odpowiedź brzmi: prawdopodobnie nie to, co chcesz zrobić.

Jeśli uruchomić SwingWorker od EDT i wezwanie SwingWorker#get będzie blokować EDT, zapobiegając jej przetwarzania żadnych nowości, które prowadzi z powrotem do powodów, dlaczego używasz SwingWorker.

W tym przypadku masz dwie możliwości. Możesz dostarczyć SwingWorker z interfejsem zwrotnym, który będzie mógł zadzwonić z done po zakończeniu operacji SwingWorker. Lub można dołączyć PropertyChangeListener do SwingWorker i monitorować wartość state, czekając aż ona równa StateValue.Done

Powiązane problemy