Java Swing对计时器的使用日期

Java Swing对计时器的使用日期,java,swing,user-interface,debugging,Java,Swing,User Interface,Debugging,试图制作一个计时器,显示按钮按下后经过的时间。我正在使用一个日期实例,并试图将其初始化为00:00:00,然后将其增加几秒、几分钟、几小时。如果我不在Date currentTime=new Date()中输入任何值,它就如同当前时间的时钟一样工作。 这是我的代码,我尝试将日期设置为所有0值,它显示为所有零,但当按下我的按钮时,它不再起计时器的作用。有什么问题 Timer timer = new Timer(1000, new ActionListener() { @O

试图制作一个计时器,显示按钮按下后经过的时间。我正在使用一个日期实例,并试图将其初始化为
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");
                }

            }
        });
该日期构造函数,与除接受毫秒参数的日期构造函数以外的所有日期构造函数一样。API被弃用是有原因的,通常是因为它们不能按预期工作。要在使用不推荐使用的API时得到通知,请打开IDE中的所有编译器警告,并注意这些警告

日期不适合存储经过的时间,因为它代表一个绝对时间点。设计用于表示时间差的类是

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

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");
        }
    }
});
最后,计时器可以使用以下方法计算持续时间:

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

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));
    }
});
该日期构造函数,与除接受毫秒参数的日期构造函数以外的所有日期构造函数一样。API被弃用是有原因的,通常是因为它们不能按预期工作。要在使用不推荐使用的API时得到通知,请打开IDE中的所有编译器警告,并注意这些警告

日期不适合存储经过的时间,因为它代表一个绝对时间点。设计用于表示时间差的类是

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

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");
        }
    }
});
最后,计时器可以使用以下方法计算持续时间:

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

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));
    }
});

同样对于
elapsedTime.toSeconds()
我得到了一个错误,它说
.toSeconds在java.time.duration中具有私有访问权限。哎呀,我的错误,在java 8中是
getSeconds()
。答复也相应更新。而且对于
elapsedTime.toSeconds()
我得到了一个错误,它说
.toSeconds在java.time.duration中有私有访问权。哎呀,我的错误,在Java8中是
getSeconds()
。答复也相应更新。并明确了私有即时字段的位置。我建议您不要使用
Date
。那门课设计得很糟糕,而且早已过时。即使你坚持(1)在一段时间内不要使用
Date
,这是完全不同的。(2) 不要使用6-arg构造函数,几十年来(字面上)它一直被弃用,因为它不可靠。请改用
Duration
from。我建议您不要使用
Date
。那门课设计得很糟糕,而且早已过时。即使你坚持(1)在一段时间内不要使用
Date
,这是完全不同的。(2) 不要使用6-arg构造函数,几十年来(字面上)它一直被弃用,因为它不可靠。改为使用来自的
Duration