Newsgroup: it.comp.java
Titolo: Comportamento inspiegabile per me con gli actionListener

Non riesco a spiegarmi un fenomeno che avviene durante il funzionamento
di una semplice interfaccia grafica da me programmata. 
Cerco di semplificare: ho una label e un bottone, quando premo il
pulsante dovrebbe avvenire questo:
- cambia il testo della label
- pausa di 2 secondi (con Thread.sleep)
- cambia di nuovo la label
In realtà avviene questo: il pulsante rimane abbassato per due secondi,
si vede solo l'ULTIMO cambiamento del testo della label! Ecco un pezzo
di codice:
class gui {
        JButton but = new JButton("Prova");
        JLabel lab = new JLabel("Dimmi che cambi...");
	public gui() {
                ActionListener l = new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                lab.setText("cambiato!");
                                try {
                                        Thread.sleep(2000);
                                } catch (Exception ex) { }
                                lab.setText("cambiato di nuovo!");
                        }
                };
         JFrame frame = new JFrame("Prova");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         Container cont = new Container();
         cont = frame.getContentPane();
         but.addActionListener(l);
         cont.setLayout(new FlowLayout());
         cont.add(lab);
         cont.add(but);
         frame.pack();
         frame.setVisible(true);
 }
        public static void main(String[] a) {
                gui g = new gui();
        }
}
Provare per credere! Io voglio che ad ogni invocazione del metodo
setText della JLabel questa si aggiorni SUBITO! Come posso fare?
Grazie in anticipo per qualsiasi aiuto,
-- 
Kwisatz

 
Il codice che gestisce gli eventi deve essere eseguito molto velocemente 
(quindi no Thread.sleep() ma spiàs...). Prova a dare un'occhiata 
(mooolto approfondita) qui:
http://java.sun.com/docs/books/tutorial/uiswing/overview/event.html
Troverai in fondo alla pagina indicazioni utili a proseguire.

 ha scritto nel messaggio
news:20030926123444.37...@libero.it...


 si vede solo l'ULTIMO cambiamento del testo della label! 
Ciao,
per ovviare al problema sostituisci
   try {
     Thread.sleep(2000);
   } catch (Exception ex) { }
   lab.setText("cambiato di nuovo!");
con
   Runnable doWorkRunnable = new Runnable() {
     public void run() {
       try {
         Thread.sleep(2000);
       } catch (Exception ex) { }
       lab.setText("cambiato di nuovo!");
     }
   };
   SwingUtilities.invokeLater(doWorkRunnable);
Ora viene la parte interessante; come mai cosi funziona?
Bhe, č lunga da spiegare... :)
Le parole chiavi sono single thread rule e event-dispatching thread .
Leggiti i seguenti articoli e vedrai la luce(come i blues brothers) ;)
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html
Marco
-- 
replay: remove .duh.spam

 ha scritto:
|> Kwisatz wrote:
|> 
|> > In realtà avviene questo: il pulsante rimane abbassato per due
|secondi,> > si vede solo l'ULTIMO cambiamento del testo della label! 
|> 
|> Ciao,
|> per ovviare al problema sostituisci
|> 
|>    try {
|>      Thread.sleep(2000);
|>    } catch (Exception ex) { }
|>    lab.setText("cambiato di nuovo!");
|> 
|> con
|> 
|>    Runnable doWorkRunnable = new Runnable() {
|>      public void run() {
|>        try {
|>          Thread.sleep(2000);
|>        } catch (Exception ex) { }
|>        lab.setText("cambiato di nuovo!");
|>      }
|>    };
|>    SwingUtilities.invokeLater(doWorkRunnable);
Di certo così è moooolto macchinoso e contorto, il mio era un esempio
semplice, il mio problema reale è di più aggiornamenti di quella label
(e non solo ovvio!), fare ogni volta così sarebbe un problema ma...
|> Ora viene la parte interessante; come mai cosi funziona?
|> Bhe, è lunga da spiegare... :)
|> Le parole chiavi sono single thread rule e event-dispatching thread .
|> Leggiti i seguenti articoli e vedrai la luce(come i blues brothers)
|;)> 
|> 
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
|> 
http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
|> 
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html
|> 
...mi metterò a leggere ben bene queste cose! Grazie!!!
-- 
Kwisatz

 ha scritto:
|> e se provassi a mettere un repaint() dopo lab.setText()?
|> Fammi sapere.
Non funziona mi spiace!
Grazie comunque!

-- 
Kwisatz

 ha scritto:

Grazie tanto, darò una bella letta...che vuol dire che "deve essere
eseguito molto velocemente"? 
Forse capirò leggendo...
-- 
Kwisatz