java - 定时器的 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");
}
}
});
解决方案
该 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));
}
});
推荐阅读
- amazon-web-services - 广告网络流量和 Lambda 调用不匹配
- c++ - SDL2 程序在最小化时会占用大量内存
- docker - 在没有编排器的情况下使用 docker 完成任务时生成一个工作容器并杀死它
- braintree - 3D Secure songbird js CSP 要求
- python - 在 Docker 构建期间导致问题的 python 版本
- android - 在方法中返回 JSONObject 响应
- javascript - 删除带有参数的函数内的事件处理程序
- php - Cloud Firestore 使用 REST API 添加多个文档 - PHP
- .net - Angular 连接到 ASP.NET API SignalR Hub 返回 404 Not Found (Identity Server 3)
- sql - 如何对 sql 连接进行聚合?