Vediamo la cosa in generale e sopratutto la situazione "tipica":Originariamente inviato da tulkas85
ora dall'interfaccia al click sul pulsante lancio il Thread..... poi ?
come utilizzo la JProgressBar ?
Dal thread io non posso sapere quanto tempo impiegherà il metodo a terminare il suo lavoro. Per questo cercavo una cosa per la quale io potessi dare una sorta di start e stop rispettivamente prima e dopo la chiamata del metodo...
1) A seguito di un "evento" devi avviare un "lavoro" lungo. L'evento tipicamente è un click su un pulsante o voce di menù ... ma potrebbe essere qualunque altra cosa (es. selezione in un combo box).
2) Nel contesto di gestione dell'evento (nel EDT) si dovrebbe prima di tutto disabilitare il/i componente/i che hanno generato l'evento (in modo che l'utente non faccia casini e non possa lanciare più volte il "lavoro"). In alcuni casi può aver senso che l'utente possa lanciare più volte il lavoro ... ma dipende da che cosa è e fa questo "lavoro", ovviamente.
3) Sempre nel EDT si crea e avvia un thread separato, ad esempio con Thread. Una volta avviato il thread separato, la gestione dell'evento può terminare qui e il controllo ritorna al framework.
4) Il thread separato esegue il lavoro e di tanto in tanto aggiorna la interfaccia utente. Il progresso può essere visualizzato in moltissimi modi, es. con un JProgressBar, con un banale JLabel che mostra semplicemente una percentuale o con un altro componente ... non ha importanza. Invece è importantissimo che l'aggiornamento di questo componente sia fatto nel contesto del EDT!! Quindi si usa invokeLater() per far eseguire un piccolo Runnable (nel EDT) che aggiorna il componente.
5) Alla fine del lavoro, sempre nel thread separato, si dovrebbe riattivare il/i componente/i che erano stati disabilitati. Anche qui stessa regola: va fatto nel contesto del EDT.
SwingWorker rispetto all'uso diretto di un Thread, ha il vantaggio che semplifica la gestione dell'aggiornamento della interfaccia utente.

Rispondi quotando