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:
Questo invece è il runnable per il ritardo nella visualizzazione.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(); } }
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) {} } }

Rispondi quotando

