Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [swing]Thread con Swing

    Ciao a tutti!

    Ho una classe che lavora con Swing.
    Ho allineato 4 label e vorrei farle visualizzare in sequenza, tipo così:
    f f f f (t=0)
    v f f f (t=1)
    f v f f (t=2)
    f f v f (t=3)
    f f f v (t=4)
    Dove v e f indicano la visibilità della label e t il tempo.

    Le ho messe in un array e poi ho creato un ciclo:

    for(...){
    arrLabel[i].setVisible(true);
    Thread.sleep(200);
    arrLabel[i].setVisible(false);
    }

    Ho provato a sfruttare Thread.sleep(tempo) ma non funziona. Il codice su swing viene eseguito solo alla fine del ciclo. Ho letto che swing si gestisce a modo suo i thread, ma non ne so di più. Come posso fare ad ottenere il risultato voluto?

    Grazie!

  2. #2
    Non mi sono spiegato bene o è una roba complicata?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Thread.sleep() interrompe l'esecuzione del programma (anche la gestione dell'interfaccia, che viene aggiornata solo al termine del metodo)

    Devi usare un Thread separato e far fare a lui il lavoro di quel metodo.


    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Ciao. Premetto che non mi sono mai cimentato in cose come questa. Cmq il problema sta che la sleep blocca l'actionListener(e anche l'interfaccia grafica), quindi vanno usati altri thread.
    Questa e' una soluzione che funziona, pero' non so se e' il modo migliore di procedere.
    Valuta tu.
    codice:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class NewClass3 extends JFrame{
        private JLabel[] labels;
        private JLabel lab1;
        private JLabel lab2;
        private JLabel lab3;
        private JButton b;
        private JPanel pan;
        /** Creates a new instance of NewClass3 */
        public NewClass3() {
            pan = new JPanel();
            lab1 = new JLabel("Uno");
            lab2 = new JLabel("Due");
            lab3 = new JLabel("Tre");
            labels = new JLabel[]{lab1,lab2,lab3};
            b = new JButton("Let's go");
            b.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //Faccio un nuovo thread
                    new Thread(new Runnable() {
                        //Faccio un contatore
                        int i=0;
    
                        public void run() {
                            //Per ogni label
                            for(i=0;i<labels.length; i++) {
                                //Aspetto un secondo
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                //E poi visualizzo la label
                                SwingUtilities.invokeLater(new Runnable() {
                                    public void run() {
                                        labels[i].setVisible(true);
                                    }
                                });
                            }
                        }
                        //Faccio partire il thread
                    }).start();
                }
            });
            lab1.setVisible(false);
            pan.add(lab1);
            lab2.setVisible(false);
            pan.add(lab2);
            lab3.setVisible(false);
            pan.add(lab3);
            pan.add(b);
            this.add(pan);
            this.setSize(400,400);
            this.setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
            this.setVisible(true);
        }
        
        public static void main(String[] args) {
            new NewClass3();
        }
    }

  5. #5
    Grazie!

    Devo dire che speravo in una cosa un po' più semplice...

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    In realta' non e' tutta farina del mio sacco. Ho trovato un articolo che ne parla QUA e QUA
    (Il secondo articolo forse presenta un codice piu' leggibile). Prova a dargli un occhiata.

  7. #7
    Interessante!
    Purtroppo ci vorrebbe almeno un mese a capire bene tutti i passaggi del codice...
    Mi sa che è meglio fare a meno di simil-animazioni, dunque

    Saluti!

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.