2013-02-13 17 views
7

Ho uno swing worker che calcola in background, mentre aggiorno un progressBar in un JFrame.Come aspettare fino al completamento di SwingWorker?

Come posso fare in modo che il thread principale attenda che doInBackground() termini?

So che posso mettere le cose nel metodo done(), ma mi stavo chiedendo se ci fosse un modo per far effettivamente aspettare il programma (quel thread, per essere corretto).

Qualcosa di simile a quello che farebbe un JDialog modale.

Quindi ...

SwingWorker a = new SwingWorker(); 
a.execute 

doOtherStuff(); 

doOtherStuff è stato eseguito solo dopo doInBackground è completa, ma senza mettere il suddetto metodo nel metodo di fatto() della SwingWorker.

+0

Uno SwingWorker rappresenta un'operazione "asincrona". Con questo paradigma, la "prossima" cosa da fare dovrebbe essere gestita in un callback, altrimenti, utilizzarlo come una sorgente di eventi asincrona acquista poco. JDialogs sono degli hacks terribili ... non qualcosa che consiglierei di provare ad emulare. –

risposta

9

La risposta breve è sì.

SwingWorker#get bloccherà fino al ritorno del metodo doInBackground.

La risposta lunga è, probabilmente non è quello che si vuole fare.

Se si avvia il SwingWorker dalla EDT e la chiamata SwingWorker#get sarà bloccare l'EDT, impedendole di elaborazione eventuali aggiornamenti che si riconduce al motivo per cui si sta utilizzando SwingWorker.

In questo caso, sono disponibili due opzioni. È possibile fornire SwingWorker con un'interfaccia di richiamata, che sarebbe in grado di chiamare da done una volta completata la SwingWorker. Oppure si potrebbe allegare una PropertyChangeListener al SwingWorker e monitorare il valore state, in attesa fino a quando non è uguale StateValue.Done

Problemi correlati