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

标签 java swing timer counter

我正在做一个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/

相关文章:

java - 为什么我的动画第一次播放时不流畅?

java - 在 JavaAgent 中停止计划任务

datetime - flutter :保持时间

java - 求某些条件下归并排序的时间复杂度

java - 通过java使用谷歌云存储

java - 无法从“三十向后移植”导入类

java - 在Java中复制一些文本后如何获取系统剪贴板图像?

java - 可能会出现什么问题?使用 getContentPane() 作为默认层 JPanel

java - 如何在JFrame中显示图像

java - 如何在java中使用方法来使用按位运算符?