Newsgroup: it.comp.java
Titolo: aggiornare il testo dopo sleep

ho scritto un'applet che gioca a poker, con tre avversari controllati dal
computer.
ora per dare un po' di ritmo al gioco voglio aggiornare il testo su dei
pulsanti dopo un certo ritardo, allora
ho usato questa funzione:
void Sleep(int x) {
    try {
      this.paintComponents(this.getGraphics());
       //  jLabelText1.repaint()  non funzionano...
        //  jLabelText1.paint(g); ecc...
      Thread.sleep(x*gameSpeed);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
ora l'unica istruzione che sembra far funzionare le cose è appunto
this.paintComponents, solo che mi ridisegna tutto e non solo i pulsanti!!!
ho provato tutti i codici dei pulsanti (repaint() non funziona..) ma niente!
se non metto quella rigail testo dei pulsanti viene aggiornato solo quando
sta a "me", ovvero quando il programma esce dal ciclo di controllo dei
giocatori e relative funzioni e attende un'evento  da me (mouseClicked,
ecc...)
aiutatemi, grazie

// ogni 2 secondi "dovrebbe" aggiornare il testo sul pulsante
  void bCambia_performed(ActionEvent e) {
    Sleep(2000);
    ((JButton)e.getSource()).setText("allora!");
    this.paint(this.getGraphics());    <---  con questa riga funziona solo
che ridisegna l'intera applet!!!
    // ((JButton)e.getSource()).paint(this.getGraphics());  <-- come mai
questo non funziona??? (anzi mi
     // disegna il pulsante in alto a sinistra :-(((
// ho provato .repaint() ma anche quello non funziona, che devo usare?
    Sleep(2000);
    ((JButton)e.getSource()).setText("ciao");
    this.paint(this.getGraphics());   <---  con questa riga funziona solo
che ridisegna l'intera applet!!!
    // ((JButton)e.getSource()).paint(this.getGraphics());
    Sleep(2000);
  }
  private void jbInit() throws Exception {
    JButton jButton1 = new JButton("Cambia testo");
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        bCambia_performed(e);
      }
    });
    this.add(jButton1);
  }
spero di essere stato più chiaro che a parole!

// ho provato .repaint() ma anche quello non funziona, che devo usare?
[CUT]
Non deve servirti nemmeno invocare il repaint(), ma è sicuramente più 
accettabile che le righe precedenti (e seguenti).
Il punto è che con lo sleep mandi a dormire il thread (Event 
Dispatching Thread) che si occupa di gestire l'interfaccia: ovvio che 
non ti cambi la scritta :-)
(Almeno questo è quello che capisco dal codice che hai mandato)
HTH
-- 
Ciao
	Fabrizio C.


beh qualcosa ho già letto, ora non mi sembra che per risolvere
un problema così banale debba andare a scomodare
la programmazione concorrente, e poi non credo proprio
che mi serva!!!
mettiamola così:
bottone con su scritto: CIAO
----> evento esterno  <-----
bottone con su scritto: EVENTO ARRIVATO
Thread.sleep(300000)   // intanto vado al cesso
E' COSì DIFFICILE???
bye

E' COSì DIFFICILE???
(non urlare)
Se non è "così difficile", perché non funzionava?
-- 
Ciao
	Fabrizio C.

Secondo il mio modesto parere non devi usare i Thread ma solo implementare
la classe del pannello che contiene il bottone con ActionListener e
implementare il metodo actionPerformed in modo che ti modifichi la scritta
sul tasto facendo riferimento direttamente all'istanza del pulsante.
Fabrizio Camera <f.came...@Mtiscali.it> wrote in message
MPG.16d2670d4...@powernews.libero.it...


Scusa, stai scrivendo molti messaggio replicando con R:. Questo può
causare dei problemi, per cui faresti cosa gradita se replicassi con
Re: .
Grazie
ciao
tityrus

sul tasto facendo riferimento direttamente all'istanza del pulsante.
Quello che scrivi è assolutamente vero in una situazione "normale", ma 
Andrea Rossi chiedeva come fare ad aggiornare, fare una pausa e poi ri-
aggiornare.
AFAIK questo si può fare solo usando *in qualche modo* i thread. Sempre 
che non si voglia bloccare tutta l'applicazione sullo sleep.
Se poi hai/avete altre soluzioni, sono pronto a ricredermi :-)
-- 
Ciao
	Fabrizio C.

E' possibile fare una cosa di questo genere:
public void actionPerformed(ActionEvent ae){
    Timer t=new Timer(1000,new ActionListener(){
                                                public void
actionPerformed(ActionEvent ev){
                                                        boolean flag=false;
                                                        if(!flag){
                                                                // setta il
testo del bottone
                                                                flag=true;
                                                        }else{
                                                                // risetta
il testo del bottone
                                                                t.close();
                                                        }
                                                }
       }
}
Fabrizio Camera <f.came...@Mtiscali.it> wrote in message
MPG.16d33190f...@powernews.libero.it...


 wrote in message
_9ca8.6951$tv6.1...@twister1.libero.it...


    Timer t=new Timer(1000,new ActionListener(){
[CUT]
Non ho provato, ma mi sembra la via "giusta".
Questo però non vuol dire "non usare il multithreading": dietro le 
quinte di Timer (entrambe le classi), c'è comunque la gestione di 
alcuni thread.
Usando Timer hai un po' più di... zucchero ;-)
Per riassumere la questione direi che (IMHO), per il problema proposto 
all'origine, c'è bisogno del multithreading, solo che l'accento è messo 
sull'esecuzione asincrona più che sulla concorrenza.
Ovviamente è solo una mia opinione, ma mi sembra abbastanza 
ragionevole. :-)
-- 
Ciao
	Fabrizio C.