broke31 ha scritto:
quindi la soluzione è quella di dover creare un nuovo therd nel mio programma?
Allora: se devi fare cose relativamente "brevi" ma temporizzate ogni tot di tempo, una soluzione è usare javax.swing.Timer.
Se invece devi eseguire un lavoro potenzialmente molto lungo e che utilizza computazioni "pesanti" oppure I/O "bloccante", la soluzione è naturalmente la creazione di un thread a parte. Questo per evitare di tenere appunto "impegnato" il EDT. Perché se lo tieni tu impegnato con tuoi lavori, è chiaro che il controllo non torna subito al framework e quindi non possono essere aggiornati i componenti Swing, né dispacciati altri eventi! Questo mi pare che lo hai già chiaro.
Creare un nuovo thread è però solo una parte della soluzione ed è invece fonte di altre questioni. Se sei nel contesto di un tuo thread,
non devi fare direttamente:
progrBar.setValue( .... );
Sono poche (davvero poche) le operazioni sulla interfaccia utente che sono documentate come "thread-safe", ovvero fattibili da qualunque thread (anche non il EDT). E setValue di JProgressBar non è tra queste.
Quindi in questo caso dovresti "far passare" la esecuzione di solo questo setValue nel EDT e per questo esistono i ben noti invokeLater/invokeAndWait di SwingUtilities.
Quindi in tuo thread la soluzione per aggiornare una progress bar dovrebbe essere:
//..... tuo lavoro .....
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progrBar.setValue( ...... );
}
});
//..... tuo lavoro .....
E comunque se usi il multi-threading devi avere anche ben chiari i concetti di sincronizzazione, mutua-esclusione, "visibilità" delle modifiche e altro.