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
。