在java中创建一个计数计时器(仅限秒和毫秒)
Posted
技术标签:
【中文标题】在java中创建一个计数计时器(仅限秒和毫秒)【英文标题】:Create a count up timer in java (seconds and milliseconds only) 【发布时间】:2013-05-24 19:43:20 【问题描述】:我正在做一个 java 中的倒计时。我找到了以下示例:Creating a Count Up timer to Break in java,它运行良好。但我想以 “mm:ss:SSS” 格式显示时间,因为我想测量非常小的时间响应。所以,当它达到 1000 毫秒时,就是 1 秒。
我做了一些更改,但我无法以假装的格式显示时间。开始出现的数字应该是秒,而不是毫秒。
如果你有比我所关注的更好的例子,那很好。
编辑:更好,但还不能正常工作。计数太慢(这里的 1 分钟对应 2 实际分钟)。我的代码在这里:
public class Counter extends JFrame
private static final String stop = "Stop";
private static final String start = "Start";
private final ClockListener clock = new ClockListener();
private final Timer timer = new Timer(1, clock);
private final JTextField tf = new JTextField(9);
public Counter()
timer.setInitialDelay(0);
JPanel panel = new JPanel();
tf.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
panel.add(tf);
final JToggleButton b = new JToggleButton(start);
b.addItemListener(new ItemListener()
@Override
public void itemStateChanged(ItemEvent e)
if (b.isSelected())
timer.start();
b.setText(stop);
else
timer.stop();
b.setText(start);
);
panel.add(b);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(panel);
this.setTitle("Timer");
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
private class ClockListener implements ActionListener
private int minutes;
private int seconds;
private int milliseconds;
@Override
public void actionPerformed(ActionEvent e)
SimpleDateFormat date = new SimpleDateFormat("mm.ss.SSS");
if (milliseconds == 1000)
milliseconds = 000;
seconds++;
if (seconds == 60)
seconds = 00;
minutes++;
tf.setText(String.valueOf(minutes + ":" + seconds + ":" + milliseconds));
milliseconds++;
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
@Override
public void run()
Counter clock = new Counter();
clock.start();
);
【问题讨论】:
毫秒是 S 不是 m 【参考方案1】:您正在计算并依赖计时器在 1 毫秒内到期。计时器(实际上是操作系统)不能保证在到期前准确且仅发生 1 毫秒,并且您在到期时运行的代码也需要一些时间。相反,使用计时器来触发刷新。我选择了 53 毫秒,因为它给用户一种毫秒飞逝的模糊感觉,但请注意,在用户单击停止后,计时器最后一次更新 1,它不一定是 53 毫秒的倍数。显示的时间与 Timer 过期次数无关,仅与用户按下开始时记录的开始时间和当前系统时间有关:
public class Counter extends JFrame
private static final String stop = "Stop";
private static final String start = "Start";
private final ClockListener clock = new ClockListener();
private final Timer timer = new Timer(53, clock);
private final JTextField tf = new JTextField(9);
private final SimpleDateFormat date = new SimpleDateFormat("mm.ss.SSS");
private long startTime;
public Counter()
timer.setInitialDelay(0);
JPanel panel = new JPanel();
tf.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
panel.add(tf);
final JToggleButton b = new JToggleButton(start);
b.addItemListener(new ItemListener()
@Override
public void itemStateChanged(ItemEvent e)
if (b.isSelected())
startTime = System.currentTimeMillis();
timer.start();
b.setText(stop);
else
updateClock();
startTime = 0;
timer.stop();
b.setText(start);
);
panel.add(b);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(panel);
this.setTitle("Timer");
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
private void updateClock()
Date elapsed = new Date(System.currentTimeMillis() - startTime);
tf.setText(date.format(elapsed));
private class ClockListener implements ActionListener
@Override
public void actionPerformed(ActionEvent e)
updateClock();
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
@Override
public void run()
Counter clock = new Counter();
);
【讨论】:
另请参阅related approach 稍长的时间。以上是关于在java中创建一个计数计时器(仅限秒和毫秒)的主要内容,如果未能解决你的问题,请参考以下文章