
Originariamente inviata da
andbin
È 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à)