Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Swing e sleep()

  1. #1

    Swing e sleep()

    Buongiorno a tutti, sono una novellina autodidatta di java e ho un problema con un programmino che vorrei fare che permetta, dopo aver premuto su un JButton all'interno di un JPanel di far comparire, ad intervalli di tre secondi, alcune JLabel su un altro JPanel.
    Ho visto che plurime invocazioni a Thread.sleep(3000) applicato all'EDT in realtà blocca l'applicazione e fa comparire tutte le etichette assieme, se sono due dopo 6 secondi.
    Ho provato quindi a destreggiarmi con SwingUtilies.InvokeAndWait, ma la soluzione mi sembra francamente poco elegante.
    Avrei 10 JLabel da far comparire e metterle ogni volta dentro un try+catch mi sembra un pasticcio.
    Vi chiedo consiglio se esiste un modo più elegante, solido e leggibile per fare quel che ho un mente.
    Vorrei che le JLabel comparissero in posizioni diverse, per questo uso un layout null e setBounds su ognuna.
    Lo scopo finale è quello di permettere all'utente di premere il pulsante e vedersi popolare una classifica di 10 partecipanti che compare con suspance dall'ultimo al primo con un intervallo tra ogni risultato.
    Sto sbagliando scegliendo InvokeAndWait? C'è qualcos'altro che fa maggiormente al caso mio?
    Grazie
    P.S.: sicuramente ci saranno altre imperfezioni, dato che sono autodidatta... ben venga ogni critica :-)

    Questa è la classe che ho scritto del pannello che contiene il JButton che dà il via:
    codice:
    import java.awt.Color; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.lang.reflect.InvocationTargetException; 
    import javax.swing.*; 
    
    public class PanPrincipale extends JPanel { 
    PanEsecutivo esec; 
    
    PanPrincipale(PanEsecutivo ese) 
    { 
    this.setBackground(Color.yellow); 
    this.setBounds(0, 0, 200, 700); 
    this.setVisible(true); 
    esec = ese; 
    JButton evento = new JButton("Evento"); 
    evento.setBounds(10, 10, 100, 30); 
    evento.addActionListener(new AscoltaEvento(esec)); 
    this.add(evento); 
    } }
    
    
    class AscoltaEvento implements ActionListener 
    { 
    PanEsecutivo esec; 
    
    AscoltaEvento(PanEsecutivo pan) 
    { 
    esec = pan; 
    } 
    
    @Override public void actionPerformed(ActionEvent e) 
    {
    esec.setBackground(Color.yellow); 
    Thread asp = new Thread() 
    { 
    @Override public void run() { 
    AspettaTre as = new AspettaTre(); 
    
    //PRIMA JLABEL 
    try 
    { 
    SwingUtilities.invokeAndWait(as); 
    JLabel lab = new JLabel("Prima etichetta"); 
    lab.setBounds(20,40,200,30); 
    esec.add(lab); 
    esec.repaint(); 
    }
    catch (InterruptedException ex) {} 
    catch (InvocationTargetException ex) {} 
    
    // SECONDA JLABEL 
    try
    { 
    SwingUtilities.invokeAndWait(as); 
    JLabel labDue = new JLabel("Seconda Etichetta"); 
    labDue.setBounds(20,80,200,30); 
    esec.add(labDue); 
    esec.repaint(); 
    } 
    catch (InterruptedException ex) {} 
    catch (InvocationTargetException ex) {} 
    
    
    //TERZA JLABEL... QUARTA... DECIMA JLABEL 
    } 
    }; 
    asp.start(); 
    } 
    }
    Questo invece è il runnable per il ritardo nella visualizzazione.
    codice:
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
    
    public class AspettaTre implements Runnable 
    { 
    @Override public void run() { 
    try { Thread.sleep(3000); } 
    catch (InterruptedException ex) {}
    } 
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    74
    Per me sarebbe meglio creare un enumerazione per le label e inserirla in un ciclo insieme allo sleep

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Per la temporizzazione in Swing si usa l'oggetto javax.swing.Timer che, ad intervalli specificati, genera un ActionEvent che verrà intercettato dall'ActionListener registrato sul Timer stesso.

    La documentazione è molto chiara e c'è pure il relativo Tutorial.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.