Far variare una Jlabel ogni tot secondi

di Anonimizzato20105 il
6 risposte
Vorrei settare il testo di una label e voglio che vari ogni secondo dopo avere premuto un button,

ho scritto questo:

JButton btnNewButton = new JButton("prova thread");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {


Thread t = Thread.currentThread();
t.setName("Thread principale");
t.setPriority(10);
System.out.println("Thread in esecuzione: " + t);


String[] NOMI = new String[5];

NOMI[0] = "aaa";
NOMI[1] = "bbb";
NOMI[2] = "ccc";
NOMI[3] = "ddd";
NOMI[4] = "eeee";


try {
for (int n = 0; n < 5; n++) {

System.out.println(NOMI[n]);

lblNomiDaPlttare.setText(NOMI[n]);


t.sleep(1000);
}
}
catch (InterruptedException e) {
System.out.println("Thread interrotto");
}
}
});
btnNewButton.setBounds(50, 238, 147, 94);
frameDelleSezioni.getContentPane().add(btnNewButton);

il System.out plotta i miei nomi ogni secondo perfettamente, ma invece il label solo alla fine con l' ultimo nome.
dove sbaglio ?
GRAZIE

6 Risposte

  • kerikcos ha scritto:


    il System.out plotta i miei nomi ogni secondo perfettamente, ma invece il label solo alla fine con l' ultimo nome.
    dove sbaglio ?
    Sbagli nel senso che non conosci bene come funziona il "threading" in Swing.
    È una cosa che ho spiegato tante volte sui forum (che non starei nemmeno a ripeterla ), ad esempio vedi in questa discussione.
  • Credo di aver risolto in questo modo:

    startButton = new JButton("START");
    startButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    startButton.setEnabled(false);
    timer.start();
    }
    });
    startButton.setBounds(307, 184, 133, 112);
    frameDelleSezioni.getContentPane().add(startButton);

    //Creo un timer
    timer = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {

    String[] NOMI = new String[5];
    NOMI[0] = "aaa";
    NOMI[1] = "bbb";
    NOMI[2] = "ccc";
    NOMI[3] = "ddd";
    NOMI[4] = "eeee";

    System.out.println(NOMI[n]);
    lblNomiDaPlottare.setText(NOMI[n]);

    n++;
    startButton.setEnabled(true);

    if(n>=5){ timer.stop();};
    }
    });

    anche se mi sembra un po laborioso.
  • kerikcos ha scritto:


    anche se mi sembra un po laborioso.
    La programmazione in Swing ... è così. Se hai compreso bene quello che dicevo nella discussione linkata prima, è già una cosa molto buona.
    Dovrai abituarti ai listener, alle inner class (spesso e volentieri le "anonymous" inner class), ai Timer, ai Runnable con SwingUtilities.invokeLater e anche altre cose.
  • Ho provato a creare una varibbile tempo

    int tempo ;


    //Create a timer.
    timer = new Timer(tempo, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {


    System.out.println(NOMI[n]);
    lblNomiDaPlottare.setText(NOMI[n]);

    n++;
    startButton.setEnabled(true);

    if(n>=NOMI.length){ timer.stop(); n=0;};
    }
    });

    ma quando la cambio durante l esecuzione del programma la routine del timer non mi risponde, cosa sbaglio.
  • kerikcos ha scritto:


    ma quando la cambio durante l esecuzione del programma la routine del timer non mi risponde, cosa sbaglio.
    Il costruttore di Timer riceve una COPIA del valore che ha tempo in quel momento. Dopo che il Timer è stato istanziato, cambiare tempo NON ha alcuna influenza sul Timer.

    Timer ha il setDelay(int delay)
  • Ok così funziona perfettamente !!!
    grazie mille
Devi accedere o registrarti per scrivere nel forum
6 risposte