2012-01-24 15 views
7

Potrebbe essere banale, sto facendo fatica a capire una semplice documentazione su SwingWorker.java SwingWorker.doInBackground() non deve accedere agli elementi della GUI

Ecco la copia incollato contenuto

Workflow

Ci sono tre fili coinvolti nel ciclo di vita di uno SwingWorker:

filo corrente: Il metodo execute() viene chiamato su questo filo. È pianifica SwingWorker per l'esecuzione su un thread di lavoro e restituisce immediatamente . Si può attendere che SwingWorker venga completato utilizzando i metodi di acquisizione .

Thread di lavoro: il metodo doInBackground() viene chiamato su questo thread. Qui è dove devono avvenire tutte le attività in background. Per notificare PropertyChangeListeners sulle modifiche delle proprietà associate utilizzare i metodi firePropertyChange e getPropertyChangeSupport(). Per impostazione predefinita, sono disponibili due proprietà associate: stato e avanzamento.

Thread di invio eventi: tutte le attività correlate a Swing si verificano in questo thread . SwingWorker richiama i metodi process e done() e notifica qualsiasi PropertyChangeListeners su questo thread.

Spesso, il thread corrente è il thread di invio eventi.

-

Il thread di lavoro non è l'EDT, quindi il codice doInBackground() non deve accedere agli elementi GUI. La mia comprensione è corretta?

Sfondo: Abbiamo un codice piccolo che utilizza SwingWorker ma ha doInBackground() che crea FileChooser e chiama setCurrentDirectory(). Sospetto che mi stia comportando un'eccezione quasi uguale a http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 (11-Closed, Not a Defect)

risposta

11

Sì. Da un thread in background - entrambi i thread regolari e SwingWorker.doInBackground non è necessario modificare l'interfaccia utente per evitare vari problemi.

Invece, avvolgere le modifiche in un Runnable e li hanno giustiziati nel EDT via SwingUtilities.invokeAndWait, SwingUtilities.invokeLater o - quando si utilizza SwingWorker - via publish (da doInBackground). All'interno del metodo process di SwingWorker, che viene eseguito dall'EDT, è possibile accedere alla GUI.

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Personalmente, trovo invokeLater e invokeAndWait più facile da usare per molte situazioni. SwingWorker va bene per es. barre di avanzamento.

+0

Grazie - facciamo quello che hai scritto in risposta a quasi tutti i posti. Ci sono alcune aree in cui il codice utilizza swingworker. Anche in questi casi, l'elaborazione potrebbe essere suddivisa in parti di accesso GUI e non gui. – Jayan

+0

Se si esegue lo split right in genere si aumentano le prestazioni ed è possibile evitare problemi, pertanto è fortemente consigliato. –

+0

@Jayan tutorial che parla dell'output da publish/process/done, puoi verificare che if (isEventDispatchThread) legga http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker- if-threat. +1 – mKorbel

Problemi correlati