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

    Cronometro in millesimi

    Salve, vorrei creare un cronometro in java con un minimo di grafica base (Start,Stop).

    Online ho trovato questo codice, perfettamente funzionante ma il problema è che è in centesimi, mentre ho bisogno anche dei Millesimi, ma non lo riesco a modificare.. qualcuno mi puo dare un consiglio anche adottando un'altra strada?

    codice:
    package Programma;
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    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;
    import javax.swing.Timer;
    
    
    /**
     * Creo il cronometro
     * 
     */
    public class Cronometro {
        private JFrame frame;  
        private JLabel labelTime;  
        private JPanel panelButtons;  
        private JButton buttonStart;  
        private JButton buttonStop;  
        private Timer timer;  
        private long startTime;  
        
        /**
         * Avvia il cronometro
         */
        public void avviaCronometro(){  
            frame = new JFrame("Cronometro");  
            frame.setBounds(600, 270, 300, 140);
    //        frame.setResizable(false);
            labelTime = new JLabel("0:00:00.0");  
            labelTime.setFont (new Font("SansSerif", Font.BOLD, 50));  
            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);  
        }  
    
    
        public static void main (String[] args) {  
            SwingUtilities.invokeLater(new Runnable () {  
                public void run() {  
                    new Cronometro().avviaCronometro();  
                }  
            });  
        } 
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    "Perfettamente funzionante" solo dal punto di vista del cronometro... se chiudi la finestra, il programma rimane appeso perchè nessuno ha pensato di fare il dispose() della finestra.

    Ad ogni modo, quel cronometro è preciso al "decimo di secondo", non al centesimo. Se vuoi averlo in centesimi/millesimi di secondo devi modificare:

    1) La temporizzazione del Timer: al momento scatta ogni 100 millisecondi (ovvero, ogni decimo di secondo, appunto); va portato a 10 millisecondi (se lo vuoi in centesimi), a 1 millisecondo se lo vuoi in millesimi.

    2) Il calcolo della variabile relativo ai decimi di secondo (decSeconds): al momento divide per 100 (calcolando, appunto, il decimo di secondo); dovrai dividere per 10 se vuoi i centesimi di secondo o non dividere affatto se vuoi i millesimi di secondo

    3) La stringa di formattazione: "%d:%02d:%02d.%d". L'ulimo segnaposto ( %d ) indica una sola cifra... se vuoi vedere 2 cifre (per i centesimi) andrà adeguata a %02d, se vuoi 3 cifre (i millesimi), dovrà essere %03d.

    Per risolvere il problema del processo java che rimane appeso alla chiusura, ti basta inserire questa riga di codice, subito dopo la creazione del JFrame:


    codice:
    frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );

    PS: copiare il codice scritto da altri può essere utile se lo scopo è quello di leggerlo, capirne il funziomanto e, solo dopo, modificarlo... copiarlo per farselo modificare dagli altri non ha alcun senso.


    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
    Ciao grazie della risposta, ho provato a seguire il tuo suggerimento, ma se divido
    codice:
    	           
     int decSeconds = (int)(diffTime % 1000 / 10);
    o diviso nulla, no mi trovo con i millesimi e i centesimi..

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    in tema di copiature
    codice:
    import java.awt.*;
    import java.awt.event.*;
    
    
    
    
    import javax.swing.*;
    
    
    
    
    /**
     * Creo il cronometro
     * 
     */
    public class Cronometro {
        private JFrame frame;  
        private JLabel labelTime;  
        private JPanel panelButtons;  
        private JButton buttonStart;  
        private JButton buttonStop;  
        private Timer timer;  
        private long startTime;  
        
        /**
         * Avvia il cronometro
         */
        public void avviaCronometro(){  
            frame = new JFrame("Cronometro");  
            frame.setBounds(600, 270, 300, 140);
    //        frame.setResizable(false);
            labelTime = new JLabel("0:00:00.000");  
            labelTime.setFont (new Font("SansSerif", Font.BOLD, 50));  
            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 milliseconds = (int)(diffTime % 1000);  
                    int seconds = (int)(diffTime / 1000 % 60);  
                    int minutes = (int)(diffTime / 60000 % 60);  
                    int hours = (int)(diffTime / 3600000);  
                    String s = String.format("%d:%02d:%02d.%03d", hours, minutes, seconds, milliseconds);  
                    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);
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        }  
    
    
    
    
        public static void main (String[] args) {  
            SwingUtilities.invokeLater(new Runnable () {  
                public void run() {  
                    new Cronometro().avviaCronometro();  
                }  
            });  
        } 
    }
    dovresti davvero acoltare i consigli di Lele però.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    non si trovano i millesimi..
    ero arrivato anche io a questa conclusione seguendo i consigli di Lele, ma quando lo avvi si trovano solo i decimi, millesimi e centesimi vanno per fatti loro..

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Nel codice di Andrea non è stato modificato il temporizzatore del Timer (sicuramente una sua svista). Se anche tu non lo hai fatto, significa che non hai letto il punto 1 da me scritto nel post precedente.

    codice:
    timer = new Timer(1, new ActionListener() { 
       ...
    });

    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

  7. #7
    Grazie mille ad entrambi

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    sì scusa, mia svista nel timer
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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 © 2024 vBulletin Solutions, Inc. All rights reserved.