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)
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
Se si esegue lo split right in genere si aumentano le prestazioni ed è possibile evitare problemi, pertanto è fortemente consigliato. –
@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