Newsgroup: it.comp.java
Titolo: swing e thread

Ciao a tutti,
dovrei gestire un evento che mi viene dato da un thread che creo, dato
questo "evento" dovrei cambiare un
immagine su di una jframe. Ho provato quando creo il thread a passare
l'oggetto che riguarda la jframe ma mi si blocca tutto
quando modifico l'immagine, mentre per modifiche che riguardano solo il
testo delle label tutto funziona.
Come potrei risolvere il problema di modificare l'immagine della jframe?
(Ora faccio una cosa un po' poco carina, cioč cambio lo stato di una
variabile nella mia classe jframe e poi quando l'utente crea un evento
muovendo il mouse vado a verificare lo stato di quella variabile e modifico
l'immagine, perň non č una bella soluzione)...
Grazie a tutti
Massimo

 l'immagine, però non è una bella soluzione)...
Il problema e' che gli aggiornamenti della GUI in Swing devono avvenire
tutti all'interno del suo event thread.
Quindi il tuo thread, una volta eseguito il suo compito, dovrebbe usare il
metodo javax.swing.SwingUtililies.invokeLater() (o invokeAndWait(), a
seconda che tu voglia un'esecuzione asincrona o sincrona). Questi metodi
ricevono un Runnable, nel cui metodo run() ci sara' il codice che esegue
l'aggiornamento dell'interfaccia grafica. L'event thread di Swing
eseguira' quel codice non appena tutti gli eventi gia' presenti saranno
stati processati.
Per le "label" (immagino dei JTextField, non delle JLabel: se ti funziona
con le JLabel e' solo un caso), l'aggiornamento funziona perche' il metodo
setText() e' costruito in modo da essere thread-safe, come dice la sua
documentazione:
"This method is thread safe, although most Swing methods are not."
Dai un'occhiata a questa pagina del Java Tutorial:
http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html
-- 
Lucio Benfante - Java User Group Padova
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

In aggiunta a quanto detto da Lucio, puoi anche usare un simpatico oggetto realizzato da
Simone Bordet che si chiama "Foxtrot" che risolve questi problemi in modo semplice:
http://foxtrot.sourceforge.net/
Ciao,
    Bruno.
-- 
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
| Membro del JUG Torino - 
http://www.jugtorino.it

-Bruno Bossola scrisse:
| In aggiunta a quanto detto da Lucio, puoi anche usare un simpatico
| oggetto realizzato da Simone Bordet che si chiama "Foxtrot" che
| risolve questi problemi in modo semplice:
| 
http://foxtrot.sourceforge.net/
|
Secondo te porta dei significativi vantaggi rispetto all'uso di SwingWorker?
--
^I^caro  -- 
http://icaro.blogspot.com/


Nella presentazione che all'epoca ci ha fatto Simone c'erano alcuni vantaggi rispetto a
SwingWorker (e ad altri approcci) ma principalmente consente di scrivere il codice in
maniera piu' lineare: una successiva manutenzione diventa piu' semplice e comoda, per non
parlare della gestione delle eccezioni e' poi molto piu' chiara.
Ad ogni modo dai un'occhiata alle slide presentate alla Java One 2002, le trovi qui:
http://sourceforge.net/projects/foxtrot/


Grazie ora capisco, ma allora la jlabel è un caso...
  javax.swing.JComponent sono thread safe??  Sulla documentazione della sun
se non specificato il metodo non è thread safe giusto?
Non esiste una lista dei metodi thread safe? A me interesserebbero quelli
safe delle JLabel perchè in pratica io
dal thread devo disabilitare un immagine per far vedere che la connessione è
caduta e lo faccio tramite una JLabel a cui ho passato una ImageIcon...
Magari posso farlo in altre maniere. Poi ho una jlabel che viene aggiornata
sempre da un thread  per aggiornare l'ora e la data correnti, allora quì
dovrò usare una jtextfield?
MaX

-Bruno Bossola scrisse:
| Ad ogni modo dai un'occhiata alle slide presentate alla Java One
| 2002, le trovi qui: 
http://sourceforge.net/projects/foxtrot/
A me SwingWorker non sembra  poi cosi' male, vabbe' che l'ho usato poche
volte, cmq non manchero' di fare qualche test!
Tx.


Ho risolto il problema, grazie! Ho modificato il codice ed ho utilizzato
SwingUtililies.invokeLater().
Max