gpt4 book ai didi

java - 在 java 中创建一个计数计时器(仅秒和毫秒)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:02 26 4
gpt4 key购买 nike

我正在做一个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();
}
});
}
}

最佳答案

您正在计数并依赖计时器在正好 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();
}
});
}
}

关于java - 在 java 中创建一个计数计时器(仅秒和毫秒),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com