PDA

View Full Version : Java Tempo


Pro7on
13-06-2007, 08:31
come posso fare una specie di cronometro dove i numeri cambiano ogni secondo graficamente in JavaSwing?

andbin
13-06-2007, 09:48
come posso fare una specie di cronometro dove i numeri cambiano ogni secondo graficamente in JavaSwing?Prova questo codice che ho appena scritto .... nulla di eccezionale eh! ma almeno ti può essere utile per capire meglio Swing. (e poi non dite che non aiuto o che dò risposte ineleganti!!).

Requisiti: Java 5 o superiore.

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 ();
labelTime.setFont (new Font ("SansSerif", Font.BOLD, 30));
labelTime.setHorizontalAlignment (JLabel.CENTER);
labelTime.setText ("0:00:00.0");

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 (50, 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 ();
}
});
}
}

redcloud
13-06-2007, 11:05
Prova questo codice che ho appena scritto ....

...
timer = new javax.swing.Timer (50, new ActionListener () {


Una curiosità: perchè 50 e non 100?

PGI-Bis
13-06-2007, 11:07
(e poi non dite che non aiuto o che dò risposte ineleganti!!)

Sei una perla :mano:

Ps.: Pare Key Horstmann si sia accorto ieri dell'esistenza della norma del thread singolo in Swing

http://weblogs.java.net/blog/cayhorstmann/archive/2007/06/the_single_thre.html

Mica male, considerato che lui è uno degli esperti...

andbin
13-06-2007, 11:23
Una curiosità: perchè 50 e non 100?Più che altro per essere abbastanza sicuro che ogni decimo di secondo venga visualizzato.
Come si sa i timer, gestiti in un sistema ad eventi ... non è detto che siano precisi precisi. Supponiamo di usare 100 e che l'ultimo timer abbia causato la visualizzazione del decimo di secondo '6' e che magari ci mancava pochissimo al passaggio al '7'. Ora immaginiamo che il timer si "rilassi" un pochino. È possibile che il '7' non venga visualizzato ma venga visualizzato '8' al prossimo evento del timer.

Si può anche mettere 100, eh! Non è mica il cronometro che usano alla NASA! ;)

mad_hhatter
13-06-2007, 11:49
Sei una perla :mano:

Ps.: Pare Key Horstmann si sia accorto ieri dell'esistenza della norma del thread singolo in Swing

http://weblogs.java.net/blog/cayhorstmann/archive/2007/06/the_single_thre.html

Mica male, considerato che lui è uno degli esperti...

ah già... ho letto qualche giorno fa la parte di javadoc relativa a questa cosa, ma non l'ho compresa a fondo (forse perchè non ho mai usato swing ne altri componenti grafici :) ) in particolare il motivo per cui si "invokelater" :D

andbin
13-06-2007, 12:05
ah già... ho letto qualche giorno fa la parte di javadoc relativa a questa cosa, ma non l'ho compresa a fondo (forse perchè non ho mai usato swing ne altri componenti grafici :) ) in particolare il motivo per cui si "invokelater" :DViene spiegato bene in questa sequenza di articoli: [1] (http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html) [2] (http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html) [3] (http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html)

redcloud
13-06-2007, 13:10
Più che altro per essere abbastanza sicuro che ogni decimo di secondo venga visualizzato.
Come si sa i timer, gestiti in un sistema ad eventi ... non è detto che siano precisi precisi. Supponiamo di usare 100 e che l'ultimo timer abbia causato la visualizzazione del decimo di secondo '6' e che magari ci mancava pochissimo al passaggio al '7'. Ora immaginiamo che il timer si "rilassi" un pochino. È possibile che il '7' non venga visualizzato ma venga visualizzato '8' al prossimo evento del timer.

Si può anche mettere 100, eh! Non è mica il cronometro che usano alla NASA! ;)

Hum e quindi per farlo preciso?