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

    Cronometro con pausa /riprendi

    Buonasera, dovrei sviluppare un cronometro che preveda la funzione di pause/resume. Sto utilizzando un codice trovato in internet per il cronometro ( che parte premendo start e si ferma premendo stop) ma non riesco ad implementare la pausa/riprendi, qualcuno può darmi una mano?

    codice:
    import java.awt.*;  
    import java.awt.event.*;  
    import javax.swing.*
    
    public class Cronometro {  
        private JFrame frame;  
        private JLabel labelTime;  
        private JPanel panelButtons;  
        private JButton buttonStart;  
        private JButton buttonStop;  
        private Timer timer;  
        private long startTime; 
    
    public Cronometro() {  
        frame = new JFrame("Cronometro");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        frame.setSize(220, 140);  
        labelTime = new JLabel("0:00:00.0");  
        labelTime.setFont (new Font("SansSerif", Font.BOLD, 30));  
        labelTime.setHorizontalAlignment(JLabel.CENTER);  
        buttonStart = new JButton("START");  
        buttonStop = new JButton("STOP");  
        buttonStop.setEnabled(false);  
        panelButtons = new JPanel(new GridLayout(1, 2));  
        panelButtons.add(buttonStart);  
        panelButtons.add(buttonStop);  
        frame.add(labelTime, BorderLayout.CENTER);  
        frame.add(panelButtons, BorderLayout.SOUTH);  
        timer = new Timer(100, new ActionListener() {  
            public void actionPerformed(ActionEvent e) {  
                long diffTime = System.currentTimeMillis() - startTime;  
                int decSeconds = (int)(diffTime % 1000 / 100);  
                int seconds = (int)(diffTime / 1000 % 60);  
                int minutes = (int)(diffTime / 60000 % 60);  
                int hours = (int)(diffTime / 3600000);  
                String s = String.format("%d:%02d:%02d.%d", hours, minutes, seconds, decSeconds);  
                labelTime.setText(s);  
            }  
        });  
        buttonStart.addActionListener(new ActionListener () {  
            public void actionPerformed(ActionEvent e) {  
                startTime = System.currentTimeMillis();  
                timer.start();  
                buttonStart.setEnabled(false);  
                buttonStop.setEnabled(true);  
            }  
        });  
        buttonStop.addActionListener(new ActionListener() {  
            public void actionPerformed(ActionEvent e) {  
                timer.stop();  
                buttonStart.setEnabled(true);  
                buttonStop.setEnabled(false);  
            }  
        });  
        frame.setVisible (true);  
    }
    Ultima modifica di LeleFT; 02-02-2015 a 14:31
    steelass

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da misterlol Visualizza il messaggio
    Sto utilizzando un codice trovato in internet per il cronometro
    È il mio che è qui.

    Quote Originariamente inviata da misterlol Visualizza il messaggio
    non riesco ad implementare la pausa/riprendi, qualcuno può darmi una mano?
    È sufficiente tenere una variabile di istanza in più es. lastDiffTime, inizialmente a 0. Il calcolo del diffTime complessivo sarà quindi il currentTimeMillis meno lo startTime più lastDiffTime.
    Quando sospendi, prendi il diffTime corrente e lo assegni a lastDiffTime, oltre ovviamente a stoppare il timer. Quando riprendi, risetti startTime e avvii il timer, proprio come fa per il pulsante Start.

    P.S. Lo Stop ovviamente resetta a 0 il lastDiffTime!
    Ultima modifica di andbin; 02-02-2015 a 10:35
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    È il mio che è qui.


    È sufficiente tenere una variabile di istanza in più es. lastDiffTime, inizialmente a 0. Il calcolo del diffTime complessivo sarà quindi il currentTimeMillis meno lo startTime più lastDiffTime.
    Quando sospendi, prendi il diffTime corrente e lo assegni a lastDiffTime, oltre ovviamente a stoppare il timer. Quando riprendi, risetti startTime e avvii il timer, proprio come fa per il pulsante Start.

    P.S. Lo Stop ovviamente resetta a 0 il lastDiffTime!
    se ho capito bene:
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    public class Cronometro
    {
    private JFrame frame;
    private JLabel labelTime;
    private JPanel panelButtons;
    private JButton buttonStart;
    private JButton buttonPause;
    private JButton buttonResume;
    private JButton buttonStop;
    private Timer timer;
    private long startTime;
    private long lastDiffTime;
    
    
    public Cronometro ()
    {
    frame = new JFrame ("Cronometro");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setSize (220, 140);
    
    
    labelTime = new JLabel ("0:00:00.0");
    labelTime.setFont (new Font ("SansSerif", Font.BOLD, 30));
    labelTime.setHorizontalAlignment (JLabel.CENTER);
    
    
    buttonStart = new JButton ("START");
    buttonStop = new JButton ("STOP");
    buttonPause = new JButton("PAUSE");
    buttonResume = new JButton("RESUME");
    buttonStop.setEnabled (false);
    
    
    panelButtons = new JPanel (new GridLayout (2, 2));
    panelButtons.add (buttonStart);
    panelButtons.add (buttonStop);
    panelButtons.add(buttonPause);
    panelButtons.add(buttonResume);
    
    
    frame.add (labelTime, BorderLayout.CENTER);
    frame.add (panelButtons, BorderLayout.SOUTH);
    lastDiffTime =0;
    timer = new Timer (50, new ActionListener () {
    public void actionPerformed (ActionEvent e) {
    long diffTime = System.currentTimeMillis () - startTime + lastDiffTime;
    
    
    int decSeconds = (int) (diffTime % 1000 / 100);
    int seconds = (int) (diffTime / 1000 % 60);
    int minutes = (int) (diffTime / 60000 % 60);
    int hours = (int) (diffTime / 3600000);
    
    
    String s = String.format ("%d:%02d:%02d.%d", hours, minutes,
    seconds, decSeconds);
    
    
    labelTime.setText (s);
    }
    });
    
    
    buttonStart.addActionListener (new ActionListener () {
    public void actionPerformed (ActionEvent e) {
    startTime = System.currentTimeMillis ();
    timer.start ();
    buttonStart.setEnabled (false);
    buttonStop.setEnabled (true);
    }
    });
    
    
    buttonStop.addActionListener (new ActionListener () {
    public void actionPerformed (ActionEvent e) {
    lastDiffTime=0;
    timer.stop ();
    buttonStart.setEnabled (true);
    buttonStop.setEnabled (false);
    }
    });
    
    buttonPause.addActionListener( new ActionListener(){
    public void actionPerformed(ActionEvent e){
    lastDiffTime = System.currentTimeMillis();
    timer.stop();
    }
    });
    
    buttonResume.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    startTime = System.currentTimeMillis();
    timer.start();
    }
    });
    
    
    frame.setVisible (true);
    }
    
    
    public static void main (String[] args)
    {
    SwingUtilities.invokeLater (new Runnable () {
    public void run () {
    new Cronometro ();
    }
    });
    }
    }
    però non mi funziona il resume. Mi da un numero enorme! Dove sbaglio?!

    (Grazie per la risposta e per la disponibilità)
    Ultima modifica di misterlol; 02-02-2015 a 18:29
    steelass

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da misterlol Visualizza il messaggio
    però non mi funziona il resume. Mi da un numero enorme! Dove sbaglio?!
    Nel pause, il lastDiffTime non è solo il currentTimeMillis() .... è quello meno lo startTime. Altrimenti non ha senso.

    E devi anche gestire correttamente la (dis)abilitazione dei pause/resume. Es. se hai cliccato start, solo stop/pause sono possibili, non resume.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Nel pause, il lastDiffTime non è solo il currentTimeMillis() .... è quello meno lo startTime. Altrimenti non ha senso.

    E devi anche gestire correttamente la (dis)abilitazione dei pause/resume. Es. se hai cliccato start, solo stop/pause sono possibili, non resume.
    anche come hai detto, invece che riprendere dal momento in cui si è messo in pausa, quando si clicca resume riparte a contare con un cronometro che è partito nel momento in cui si era cliccato pause e non dal valore fissato nel cronometro stesso. (in particolare ieri sera mi succedeva la stessa cosa identica ed è stato proprio questo a farmi postare la domanda!)

    Per la disabilitazione dei tasti lo so, non ho ancora scritto quelle 2 righe in più di codice perchè prima volevo sistemare questa faccenda.
    steelass

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da misterlol Visualizza il messaggio
    anche come hai detto, invece che riprendere dal momento in cui si è messo in pausa, quando si clicca resume riparte a contare con un cronometro che è partito nel momento in cui si era cliccato pause
    Sì, scusa, mi stavo dimenticando di una cosa: al pause, il periodo corrente cronometrato (il currentTimeMillis() - startTime) deve aggiungersi al lastDiffTime .... non rimpiazzarlo del tutto!
    Il lastDiffTime è sostanzialmente la somma di tutti i periodi precedenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    grazie mille dell'aiuto!
    steelass

Tag per questa discussione

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.