gpt4 book ai didi

java - 停止秒表

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:05 26 4
gpt4 key购买 nike

我在添加到另一个类 (JFrame) 的 JPanel 类中有以下代码。我要实现的是某种秒表程序。

startBtn.addActionListener(new startListener());

class startListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Timer time = new Timer();
time.scheduleAtFixedRate(new Stopwatch(), 1000, 1000);
}
}

这是另一个基本任务的类。

public class Stopwatch extends TimerTask {

private final double start = System.currentTimeMillis();

public void run() {
double curr = System.currentTimeMillis();
System.out.println((curr - start) / 1000);
}
}

计时器工作正常,这肯定远未完成,但我不确定如何编写应该停止计时器的停止按钮。对此有何建议?顺便说一句,我正在使用 java.util.timer

编辑:我希望能够在停止后再次启动它(不重置计时器)

最佳答案

您可以取消整个 Timer调用Timer.cancel() ,或者您可以通过调用 TimerTask.cancel() 取消个别任务.

无论哪种方式,您都需要在创建时保留对计时器和/或任务实例的引用,以便您的停止例程可以调用适当的取消方法。

更新:

所以您实际上希望能够暂停计时器?我认为 java.util.Timer 中的标准接口(interface)不支持此功能.您可以通过添加 pause() 来做到这一点方法(或类似方法)添加到您的自定义任务中,记录截至该点的耗时,并在再次单击开始按钮时重新开始计数。请注意,使用此技术,您不会停止计时器任务本身,直到您完全完成它。它仍然在后台运行,但您只能在秒表启动并“运行”(即某种标志来指示秒表的状态)时对其执行任何操作。

一些注意事项:

  • java.util.Timer在非 EDT 线程上运行,因此如果您在计时器和 Swing Action 事件中都与成员变量进行交互,则需要适本地处理多线程的影响。这可能值得调查 javax.swing.Timer ,这将在 EDT 上触发事件。

  • 另外,如果您想要 super 精准的秒表,您可以考虑使用 System.nanoTime()而不是 currentTimeMillis() .

关于java - 停止秒表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com