首页 > 解决方案 > 定时器的 Java Swing 使用日期

问题描述

尝试制作一个计时器,显示自按下按钮以来经过的时间。我正在使用一个 Date 实例,并试图让它初始化00:00:00并让它增加几秒钟、几分钟,然后几小时。如果我没有在其中输入任何值,它只是当前时间的时钟Date currentTime = new date() 这是我的代码,我尝试将日期设置为全 0 值,它显示为全零,但是当我的按钮被按下时,它没有更长的功能作为一个计时器。问题是什么?

 Timer timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Date currentTime = new Date(0,0,0,0,0,0);
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                laserOnTimeTF.setText(sdf.format(currentTime));
            }
        });

        laserOnOff.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!laserSetting) {
                    timer.start();
                    laserSetting = true;
                    laserOnOff.setText("Laser On");
                } else {
                    timer.stop();
                    laserSetting = false;
                    laserOnOff.setText("Laser Off");
                }

            }
        });

标签: javaswinguser-interfacedebugging

解决方案


该 Date 构造函数已弃用,就像所有 Date 构造函数一样,除了采用毫秒参数的构造函数。API 被弃用是有原因的,通常是因为它们没有按预期工作。要在您使用已弃用的 API 时收到通知,请在 IDE 中打开所有编译器警告,并注意这些警告。

日期不适合存储经过的时间,因为它代表一个绝对时间点。旨在表示时间差的类是java.time.Duration

您可以从两个时间值计算持续时间。最简单的时间值可能是Instant,因此您需要Instant在类中创建一个类型的私有字段,该字段创建 Timer 并向按钮添加侦听器,以跟踪按下按钮的时间:

private Instant timeOfLastButtonPress;

然后您可以在每次实际按下按钮时对其进行初始化:

laserOnOff.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if (!laserSetting) {
            timeOfLastButtonPress = Instant.now();
            timer.start();
            laserSetting = true;
            laserOnOff.setText("Laser On");
        } else {
            timer.stop();
            laserSetting = false;
            laserOnOff.setText("Laser Off");
        }
    }
});

最后,您的 Timer 可以使用Duration.between计算持续时间:

Duration elapsedTime =
    Duration.between(timeOfLastButtonPress, Instant.now());

如果您使用的是 Java 9 或更高版本,则可以直接从 Duration 中提取数字:

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Duration elapsedTime =
            Duration.between(timeOfLastButtonPress, Instant.now());
        laserOnTimeTF.setText(String.format("%02d:%02d:%02d",
            elapsedTime.toHoursPart(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart()));
    }
});

在 Java 8 中,您需要自己计算:

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Duration elapsedTime =
            Duration.between(timeOfLastButtonPress, Instant.now());
        laserOnTimeTF.setText(String.format("%02d:%02d:%02d",
            elapsedTime.toHours(),
            elapsedTime.toMinutes() % 60,
            elapsedTime.getSeconds() % 60));
    }
});

推荐阅读