Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Errore resettare un cronometro
Forum - Java - Errore resettare un cronometro

Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 16:12
Sabato, 07/11/2015
allora inizialmente ho avuto problemi nell implementazione del cronometro con i thread e la gui, però poi sono riuscito a trovare un algoritmo che mi faccia funzionare il tutto. L'unico problema è che quando chiudo il thread e quindi la finestra del cronometro(chiudo sia il thread e sia la finestra tramite un bottone presente nel programma principale), il cronometro continua a contare i secondi partendo dai secondi contati precedentemente.. io invece vorrei che quando chiudo il thread e poi lo riapro iniziasse a contare da 0. Alla prima botta va tutto benissimo mentre quando chiudo e riapro ho questo problema. posto dei pezzi di codice che possono servire:
questa è la classe dove è implementato lo svolgimento del thread
Codice sorgente - presumibilmente Java

  1. public class Cronometro  implements Runnable{
  2.         private JLabel visualizzazione;
  3.         private long startTime = System.currentTimeMillis ();;
  4.        
  5.        
  6.         public Cronometro(JLabel labelTime) {
  7.                 // TODO Auto-generated constructor stub
  8.                 visualizzazione = labelTime;
  9.         }
  10.  
  11.         @Override
  12.         public void run() {
  13.                 // TODO Auto-generated method stub
  14.                
  15.                 while(true){
  16.                 long diffTime = System.currentTimeMillis () - startTime;
  17.                 int decSeconds = (int) (diffTime % 1000 / 100);
  18.                 int seconds = (int) (diffTime / 1000 % 60);
  19.                 int minutes = (int) (diffTime / 60000 % 60);
  20.                 int hours = (int) (diffTime / 3600000);
  21.  
  22.                 String s = String.format ("%d:%02d:%02d.%d", hours, minutes,
  23.                 seconds, decSeconds);
  24.  
  25.                 visualizzazione.setText (s);
  26.                 }
  27.         }
  28.  
  29. }


qui invece è implementata una finestra che appartiene al programma principale ( è come se il programma principale abbia 2 finestra, la prima che è quella dove è presente il bottone di stop, la seconda che è quella che compare quando avvio il cronometro )
Codice sorgente - presumibilmente Java

  1. private void creafinestra() {
  2.                
  3.                 Cronometro cron = new Cronometro(labelTime);
  4.                 final Thread processocronometro = new Thread(cron);
  5.                
  6.                 labelTime.setFont (new Font ("SansSerif", Font.BOLD, 30));
  7.                 labelTime.setHorizontalAlignment (JLabel.CENTER);
  8.                
  9.                 final JButton buttonStart = new JButton ("START");
  10.                 final JButton buttonStop = new JButton ("STOP");
  11.                 buttonStop.setEnabled (false);
  12.                
  13.                 buttonStart.addActionListener(new ActionListener(){
  14.  
  15.                         @Override
  16.                         public void actionPerformed(ActionEvent e) {
  17.                                 // TODO Auto-generated method stub
  18.                                 if(processocronometro.isAlive()){
  19.                                         processocronometro.resume();
  20.                                 }else{
  21.                                         processocronometro.start();
  22.                                 }
  23.                                
  24.                                 buttonStart.setEnabled (false);
  25.                                 buttonStop.setEnabled (true);
  26.                         }});
  27.                
  28.                 buttonStop.addActionListener(new ActionListener(){
  29.  
  30.                         @Override
  31.                         public void actionPerformed(ActionEvent e) {
  32.                                 // TODO Auto-generated method stub
  33.                                 processocronometro.suspend();
  34.                                 buttonStart.setEnabled (true);
  35.                                 buttonStop.setEnabled (false);
  36.                         }});
  37.                
  38.                 JPanel panelButtons = new JPanel (new GridLayout (1, 2));
  39.                 panelButtons.add (buttonStart);
  40.                 panelButtons.add (buttonStop);
  41.                
  42.                 finestracronometro.add (labelTime, BorderLayout.CENTER);
  43.                 finestracronometro.add (panelButtons, BorderLayout.SOUTH);
  44.                 finestracronometro.addWindowListener(new GestoreFinestra(finestracronometro));
  45.                 finestracronometro.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
  46.                 finestracronometro.setSize (220, 140);
  47.                 finestracronometro.setLocation(500,350);
  48.                 finestracronometro.setVisible(true);
  49.                
  50.         }
  51.  
  52. }


qui è dove si avvia il cronometro:
Codice sorgente - presumibilmente Plain Text

  1. if(pulsante.equals(this.cronometro)){
  2.                         creafinestra();
  3.                         this.cronometro.setEnabled(false);
  4.                         this.finecronometro.setEnabled(true);
  5.                 }


qui è dove chiudo la finestra e quindi anche il thread:
Codice sorgente - presumibilmente Plain Text

  1. if(pulsante.equals(this.finecronometro)){
  2.                         this.finecronometro.setEnabled(false);
  3.                         this.cronometro.setEnabled(true);
  4.                         finestracronometro.setVisible(false);
  5.                         labelTime.setText("0:00:00.0");
  6.                 }


mentre questa è la classe gestorepulsante con l'actionlistener:(metto solo gli attributi che servono )
Codice sorgente - presumibilmente Java

  1. private JButton fineorologio;
  2.         private OraBari orarioattuale = new OraBari();
  3.         private JButton orologio;
  4.         private Thread processorologio = new Thread(orarioattuale);
  5.         private JButton cronometro;
  6.         private JButton finecronometro;
  7.         private JButton agenda;
  8.         private JButton fineagenda;
  9.         private JFrame finestracronometro = new JFrame("Cronometro");
  10.         private JLabel labelTime = new JLabel ("0:00:00.0");



spero di essere stato chiaro.. ripeto: l'unico problema che riscontro è quello che quando vado a riaprire il thread, il cronometro continua a contare dai secondi dove si è fermato prima, io invece voglio che iniziasse a contare da 0 come la prima volta che lo lancio! :alert:

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:53
Lunedì, 09/11/2015
Codice sorgente - presumibilmente Java

  1. private long startTime;      
  2.        @Override
  3.         public void run() {
  4.             startTime = System.currentTimeMillis ();
  5.         }



Il mio blog: https://piero.dev
PM Quote