如果鼠标在 2 分钟内没有移动,我想重新启动我的程序。 我试图设置一个计时器并在每次鼠标移动时重新启动它,但到目前为止没有任何效果。 有没有人可以帮我解决这个问题?
frame.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
timer.cancel();
timer.purge();
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
frame.dispose();
try {
MyWeb neu = new MyWeb();
} catch (IOException e) {
e.printStackTrace();
}
}
}, 5000);
}
});
最佳答案
Swing 计时器
您想使用 Swing 计时器 ( javax.swing.Timer
) 而不是普通计时器 ( java.util.Timer
)。查看Oracle Tutorial .
自动线程
Swing 计时器的特殊之处在于它会自动处理背景上的计时器滴答声,当最终触发时,计时器会自动处理在 Swing 的主 GUI 线程上运行您的任务。所以你不必关心线程的细节。
永远不要在后台线程上访问您的 GUI 小部件是非常非常非常重要的。您可能侥幸逃脱,或者您可能会彻底破坏您的应用程序。 Swing Timer 的发明是为了处理在后台线程上倒计时但又切换回 GUI 线程以运行任务代码的繁琐工作。
TimerTask
关闭您的应用
将您在触发计时器时要完成的工作写为 java.util.TimerTask
.
算法
Swing Timer 可以触发一次或重复触发。你想开火一次。触发后,关闭您的应用程序。
在您的应用启动时设置计时器。在您的应用程序中存储对该计时器的引用。为您想要的 2 分钟倒计时配置计时器。每次鼠标移动,调用restart
在 Swing 计时器上。所以 2 分钟倒计时不断回到 2 分钟。您的应用可能会运行数小时,而 2 分钟计时器会一遍又一遍地重置。
launch timer (2 mins) → on mouse move ↓ → timer fires → shutdown app
↑ ← restart timer ←
关机与重启
当倒计时结束时,我不确定您是要关闭、重新启动,还是只是重新初始化应用中的某些状态。如果是最后一个(重新初始化状态),请将您的计时器设置为重复触发而不是一次触发。其余方法保持不变。
可能的优化
我不确定,但我怀疑在每次 鼠标移动时重置计时器可能有点矫枉过正,并且可能会降低一些性能。个人资料自己看。如果确实需要大量成本,只需跟踪上次重置计时器的时间即可。要跟踪那一刻,请使用 Instant
目的。调用Instant.now()
捕捉每一次鼠标移动的当前时刻。使用 Duration.between
计算耗时.当duration超过任意限制,比如 5 秒,重新启动 Swing 计时器,并更新您存储的“计时器上次重新启动时间”Instant
。 Instant.now
以 milliseconds 的分辨率捕获当前时刻在 Java 8 中,分辨率为 microseconds在 Java 9 及更高版本中。 (Instant
实际上包含 nanoseconds ,但传统的计算机时钟无法正常运行。)
关于java - 如果鼠标正在移动,则重新启动计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173333/