Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Stoppare un Timer

  1. #1

    Stoppare un Timer

    Salve ragazzi, sono alle prese con un problema che sembra essere banale, ma non ne riesco a venire a capo.
    Sto realizzando Forza4 e per implementare dei livelli ho deciso di creare un countDown che al suo scadere genera tramite un random una colonna dove inserisce una pallina. Sono riuscito a far questo con il mio gruppo di lavoro, ma ovviamente l'obiettivo del gioco non è quello di far scadere il timer, quindi il countDown ogni qual volta premo un JButton che mi fa inserire una pallina deve stopparsi e poi riprendere da capo, ma io ottengo una sovrapposizione come se fossero due timer vi posto il codice in questione nella speranza che qualcuno mi riesca a dare una dritta a riguardo..
    codice:
    static class CountDown
        {
            private static ActionListener action;
            private static int attesa = 1000;
            private static GiocoForza4 f4;
            private static Timer t;        
            private static int valoreTimer = 5;
            private static int count = valoreTimer;        
            
            public static void start() 
            {
                action = new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {
                        // versione alternativa                             
                                       if(valoreTimer >= 0)
                                        {
                                            time2.setText("        " + valoreTimer + "        ");                                        
                                            System.out.println(valoreTimer);
                                            valoreTimer--;
                                            
                                        }
                                        else
                                        {                                        
                                            ((Timer) e.getSource()).stop();
                                            //System.out.println("E' 0 e vado in else");
                                            //t.stop();
                                            Griglia.random(); // questo genera il Random                                       
                                            valoreTimer = count;                                  
                                        }
                    }
                    
                };
                
                t = new Timer(attesa, action);
                t.start();
                //System.out.println("Ora ti stoppo");
                //t.stop();
            } 
            
            public static void fermati()
            {
                if(t.isRunning())
                {
                   t.stop(); 
                }
                System.out.println("PROVA STOP");            
                                    
                System.out.println("Prova dopo STOP");
            }        
            
            
        }
    ho postato solo la parte di codice relativa al timer perchè dopo il resto funziona bene e anche quando richiamo lo stop, sembra che venga chiamato nel punto giusto come mi dimostrano i messaggi di output..cmq qualora servisse posto tutto..

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,318
    No... se vuoi che il timer ricominci a contare dall'inizio non lo devi stoppare e, soprattutto, non da dentro il suo ActionListener (quando ormai è troppo tardi).

    La soluzione è quella di far sì che l'ActionListener dei pulsanti richiami un restart() sul Timer.

    Dalla documentazione del metodo restart() di di Timer:

    Restarts the Timer, canceling any pending firings and causing it to fire with its initial delay.
    In questo modo, ogni volta che viene premuto un pulsante, questo resetta il timer.

    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

  3. #3
    Innanzitutto grazie mille per la disponibilità, ma non ho capito bene, potresti farmi un esempio pratico se non è troppo disturbo ?

  4. #4
    allora io ho scritto nell' ActionPerformed dove ho i miei pulsanti:
    codice:
    GiocoForza4.CountDown.t.restart();
    ma sembra che non cambi niente
    il codice della griglia è questo:
    codice:
    public class Griglia extends JPanel implements ActionListener
    {
        final static int diametro = 88;
        final static int spazio = 6; // spazio tra due pedine
        final static int bordiLaterali = 171; // distanza dai bordi verticali
        final static int bordiVerticali = 35; // distanza dai bordi orizzontali 
        private static int colonne = 7; // definiamo il numero di colonne
        private static int righe = 6; // definiamo il numero di righe
        private static int[][] griglia;    
        private static Graphics2D g2;    
        URL url = getClass().getResource("../Immagini/indicatore.png");
        ImageIcon img = new ImageIcon(url);
        
        // definiamo i pulsanti
        private static JButton a;
        private static JButton b;
        private static JButton c;
        private static JButton d;
        private static JButton e;
        private static JButton f;
        private static JButton g;
        
        //private static GiocoForza4.JLabel time2;
        private static JPanel panel;
        
        // andremo a colorare gli spazi bianchi quando clicchiamo sulla colonna
        private static int BIANCO = 0;
        private static int ROSSO = 1;
        private static int GIALLO = 2;
        
        // variabili boolean
        private static boolean end;    
        private static boolean parita = true;
        
        //private int iniziaColore;
        private static int turno = 0;
        
       
        public Griglia()
        {    
            panel = new JPanel();
            //time2 = new JLabel();
            //panel.add(time2);
            
            griglia = new int[colonne][righe];
            /*
             *  abbiamo aggiunto al pannello, l'azione che ci permette una volta cliccato
             * di aggiungere qualcosa
             */     
            a = new JButton();        
            a.setContentAreaFilled(false);  // questo metodo permette di dare la trasparenza ad un JButton      
            a.setIcon(img);
            a.setPreferredSize(new Dimension(diametro, 25));
            a.addActionListener(this);
            this.add(a);
            
            
            b = new JButton();
            b.setContentAreaFilled(false);      
            b.setIcon(img);
            b.setPreferredSize(new Dimension(diametro, 25));
            b.addActionListener(this);
            this.add(b);
            
            c = new JButton();
            c.setContentAreaFilled(false);      
            c.setIcon(img);
            c.setPreferredSize(new Dimension(diametro, 25));        
            c.addActionListener(this);
            this.add(c);
            
            d = new JButton();
            d.setContentAreaFilled(false);      
            d.setIcon(img);
            d.setPreferredSize(new Dimension(diametro, 25));
            d.addActionListener(this);
            this.add(d);
            
            e = new JButton();
            e.setContentAreaFilled(false);      
            e.setIcon(img);
            e.setPreferredSize(new Dimension(diametro, 25));
            e.addActionListener(this);
            this.add(e);
            
            f = new JButton();
            f.setContentAreaFilled(false);      
            f.setIcon(img);
            f.setPreferredSize(new Dimension(diametro, 25));
            f.addActionListener(this);
            this.add(f);
            
            g = new JButton();
            g.setContentAreaFilled(false);      
            g.setIcon(img);
            g.setPreferredSize(new Dimension(diametro, 25));
            g.addActionListener(this);
            this.add(g);
            
            inizia();
        }
        
        public void paintComponent(Graphics g) // disegniamo la griglia che conterrà le pedine
        {         
            super.paintComponent(g);
            //g.setColor(Color.BLUE);
            g2 = (Graphics2D) g;       
            g2.setColor(Color.BLUE);        
            g2.fillRect(0, 0, getSize().width, getSize().height); // settare le dimensioni del panel
            
             
            /*
             *  disegniamo un rettangolo le cui dimensioni si adattano al pannello (ultimi due parametri)
             * e i primi due danno la posizione di partenza del rettangolo
             */
            for (int i=0; i<colonne; i++)
                {            
                    for (int j=0; j< righe; j++)
                    {
                        if(griglia[i][j]== BIANCO) // se uguale 0
                        {g2.setColor(Color.WHITE);} // il colore è bianco
                        if(griglia[i][j]== ROSSO) // se uguale a 1
                        {g2.setColor(Color.RED);} // colore rosso
                        if(griglia[i][j]== GIALLO) // se uguale a 2
                        {g2.setColor(Color.YELLOW);} // colore giallo
                        //definiamo il colore che deve avere l'ovale
                        /*
                         * disegniamo l'ovale che conterrà le pedine. Come coordianate affinchè possa ripetersi l'ovale 
                         * per il numero di volte che a noi serve, ci poniamo lo spazio
                         */   
                        //g2.fillOval((spazio + (spazio + diametro)*i), (spazio + (spazio + diametro)*j) ,diametro, diametro);
                        g2.fillOval((bordiLaterali + (spazio + diametro)*i), (bordiVerticali + (spazio + diametro)*j) ,diametro, diametro); 
                        //
                        repaint();   
                    } 
                }
        }
        
        public void inizia()
        {
            griglia = new int[colonne][righe];
            
            for(int i = 0; i < colonne; i++)
            {
                for(int j = 0; j < righe; j++)
                {
                    griglia[i][j] = BIANCO; 
                }
            }
        }
        
        public static void random()
        {
            Random x = new Random();
            int casuale = x.nextInt(7);
            gioca(casuale);
        }
        
        public static void gioca(int colonna) // metodo che stabilisce l'inserimento della pedina (gravità sulla riga)
        {
            
            for(int i = righe - 1; i >= 0; i--) // parte dal basso
            {
                //GiocoForza4.CountDown.fermati();
                if(griglia[colonna][i] == BIANCO)
                {                
                    if((turno % 2) == 0)
                    {
                        griglia[colonna][i] = ROSSO;
                    }
                    else
                    {                    
                        griglia[colonna][i] = GIALLO;
                    }                      
                   
                    controllo(g2);        
                    GiocoForza4.CountDown.start(); // qui viene richiamato il countDown    
                    
                    turno++;
                    
                    // Controllo parità
                    if(turno == 42 && parita == true)
                    {
                        Parita x = new Parita();
                        x.setVisible(true);  
                    }
                    
                    break; 
                }           
                panel.repaint();
            }
        }
       
        public static void controllo(Graphics g)
        {     
            // controllo verticale sulla colonna        
            for (int col = 0; col < colonne; col++)
            {        
                    for (int rig = righe - 1; rig >= righe - 3; rig--)
                    {                    
                        int confronto = griglia[col][rig];
                        if(confronto > 0 && confronto == griglia[col][rig-1] && confronto == griglia[col][rig-2] && confronto == griglia[col][rig-3])
                        {   
                           // if(end) return;                        
                            
                             Vittoria x = new Vittoria();
                             x.setVisible(true);                         
                             parita = false;
                             end = true;
                        }
                    }
            }
            
            // controllo orizzontale sulla riga
            for (int rig = righe - 1; rig >= 0 ; rig--) // riga fissa
            {            
                for (int col = 0; col < colonne - 3; col++) // colonna in movimento
                {
                    int confronto = griglia[col][rig];
                    if(confronto > 0 && confronto == griglia[col+1][rig] && confronto == griglia[col+2][rig] && confronto == griglia[col+3][rig])
                    {                   
                        Vittoria x = new Vittoria();
                        x.setVisible(true);    
                        parita = false;
                        end = true;
                    }        
                }        
            }
            
            // controllo diagonale da sinistra a destra
            for (int rig = righe - 4; rig >= 0; rig--)
            {
                for(int col = 0; col < colonne - 3; col++)
                {
                    int confronto = griglia[col][rig];
                    if(confronto > 0 && confronto == griglia[col+1][rig+1] && confronto == griglia[col+2][rig+2] && confronto == griglia[col+3][rig+3])
                    {
                        Vittoria x = new Vittoria();
                        x.setVisible(true);  
                        parita = false;
                        end = true;
                        
                    }
                }
            }
            
            // controllo diagonale da destra a sinistra
            for (int rig = righe - 3; rig <= righe - 1; rig++)
            {
                for(int col = 0; col < colonne - 3; col++)
                {
                    int confronto = griglia[col][rig];
                    if(confronto > 0 && confronto == griglia[col+1][rig-1] && confronto == griglia[col+2][rig-2] && confronto == griglia[col+3][rig-3])
                    {
                        Vittoria x = new Vittoria();
                        x.setVisible(true); 
                        parita = false;  
                        end = true;
                    }
                }
            }        
        }
        
        @Override
        public void actionPerformed(ActionEvent evento)
        {       
            GiocoForza4.CountDown.t.restart();
            System.out.println("Prova");
            if((a) == evento.getSource())        {
                
                if (end) return; // impedisce che altri JButton vengano premuti 
                                 // qualora uno dei due utenti ha realizzato Forza 4
                
                gioca(0);
            }  
            if((b) == evento.getSource())
            {
                if (end) return;
                gioca(1);
            }   
            if((c) == evento.getSource())
            {
                if (end) return;
                gioca(2);
            }   
            if((d) == evento.getSource())
            {
                if (end) return;
                gioca(3);
            } 
            if((e) == evento.getSource())
            {
                if (end) return;
                gioca(4);
            }       
            if((f) == evento.getSource())
            {
                if (end) return;
                gioca(5);
            }       
            if((g) == evento.getSource())
            {
                if (end) return;            
                gioca(6);
                
            }
            
        }  
    }
    nel metodo gioca avevo posto il lancio del CountDown, credevo fosse corretto, ma ora sto inziando ad avere dubbi..

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,318
    Ho visto solo ora l'aggiornamento della discussione e mi sono anche accorto di aver sbagliato il nome del metodo di Timer: il metodo da richiamare è restart() non reset() (che non esiste).

    Comunque, qui un esempio scritto al volo che ti fa vedere il funzionamento di questo metodo:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class EsempioTimer extends JFrame implements ActionListener {
    
       private class Stampa implements ActionListener {
          @Override
          public void actionPerformed(ActionEvent ae) {
             stampa();
          }
       }
    
       private class Controllo implements ActionListener {
          @Override
          public void actionPerformed(ActionEvent ae) {
             controllo();
          }
       }
    
       private JLabel lblTimer;
       private JButton cmdResetta;
       private JTextArea txtArea;
    
       private Timer timerStampa;
       private Timer timerControllo;
    
       private int timeOut;
    
       public EsempioTimer() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          timeOut = 4;
    
          lblTimer = new JLabel();
    
          txtArea = new JTextArea();
          JScrollPane jsp = new JScrollPane( txtArea );
    
          cmdResetta = new JButton("Resetta timer");
          cmdResetta.addActionListener( this );
    
          JPanel jp = new JPanel( new FlowLayout(FlowLayout.CENTER, 1, 10) );
          jp.add( cmdResetta );
    
          c.add(lblTimer, BorderLayout.NORTH);
          c.add(jsp, BorderLayout.CENTER);
          c.add(jp, BorderLayout.SOUTH);
    
          setTitle("Esempio timer");
          setSize(300, 400);
          setLocationRelativeTo( null );
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setVisible( true );
    
          timerStampa = new Timer(5000, new Stampa());
          timerControllo = new Timer(1000, new Controllo());
          timerControllo.start();
          timerStampa.start();
       }
    
       private void controllo() {
          lblTimer.setText("Fra " + timeOut + " secondi verrà aggiunta una scritta");
          timeOut--;
       }
    
       private void stampa() {
          txtArea.append("Ecco una scritta!\n");
          timeOut = 5;
       }
    
       @Override
       public void actionPerformed(ActionEvent ae) {
          timeOut = 4;
          timerStampa.restart();
          timerControllo.restart();
       }
    
       public static void main(String[] args) {
          EsempioTimer et = new EsempioTimer();
       }
    }
    Quello che interessa a te è il funzionamento del Timer chiamato "timerStampa", che in pratica funziona come il tuo timer: se non viene premuto il pulsante entro 5 secondi, lui stampa una riga nella TextArea (l'altro timer serve solo a visualizzare il countdown a video). Al contrario, se viene premuto il pulsante, allora il timer viene resettato (chiamo restart()) e si avranno a disposizione ulteriori 5 secondi prima che la stringa venga scritta.

    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

  6. #6
    SI grazie mille della disponsibilità avevto intuito che il comando suggeritomi fosse il restart() fatto sta che io ero riuscito a risolvere con due Timer; quando si premeva un JButton praticamente il primo timer si stoppava, veniva inizializzato a 5 il nuovo Timer e iniziava quest' ultimo
    Grazie ancora

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.