Java 如果鼠标正在移动,请重新启动计时器
如果鼠标在2分钟内没有移动,我想重新启动我的程序。 我试图设置一个计时器,并在每次鼠标移动时重新启动它,但到目前为止没有任何效果。 有人能帮我解决这个问题吗Java 如果鼠标正在移动,请重新启动计时器,java,swing,timer,restart,Java,Swing,Timer,Restart,如果鼠标在2分钟内没有移动,我想重新启动我的程序。 我试图设置一个计时器,并在每次鼠标移动时重新启动它,但到目前为止没有任何效果。 有人能帮我解决这个问题吗 frame.addMouseMotionListener(new MouseAdapter() { public void mouseMoved(MouseEvent e) { timer.cancel(); timer.purge(); timer =
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);
}
});
到目前为止,我的解决方案如下: 您可以创建自己的
线程
,该线程将休眠2秒。如果这段时间结束了,你可以做任何你想做的事。如果移动鼠标,您可以中断线程
并重复:
public class MyMouseMotionListener implements MouseMotionListener {
private final Thread timerThread;
public MyMouseMotionListener() {
this.timerThread = new Thread(new SleeperThread());
this.timerThread.start();
}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e) {
this.timerThread.interrupt();
}
}
而线程:
public class SleeperThread implements Runnable {
@Override
public void run() {
while(true) {
try{
Thread.sleep(2000);
System.out.println("Do Whatever you want.");
} catch(InterruptedException ex) {
System.out.println("Do nothing yet.");
}
}
}
}
摆动计时器
您希望使用Swing计时器()而不是普通计时器()。看
自动穿线
Swing计时器的特殊之处在于它会自动处理后台的计时器滴答声,当最终触发时,计时器会自动处理在Swing的主GUI线程上运行任务。因此,您不必关心线程的细节
绝对不要在后台线程上访问GUI小部件,这一点非常重要。你可能会侥幸逃脱,也可能会彻底破坏你的应用程序。Swing计时器被发明用来处理后台线程倒计时的琐事,同时切换回GUI线程来运行任务的代码
TimerTask
关闭应用程序
写下你要在定时器启动时完成的工作
算法
摆动计时器可以触发一次或多次。你想开枪一次。启动后,关闭应用程序
设置应用程序启动时的计时器。在应用程序中存储对该计时器的引用。为所需的2分钟倒计时配置计时器。每次鼠标移动时,调用Swing计时器。因此,2分钟倒计时一直被设置为2分钟。您的应用程序可能会运行数小时,2分钟的计时器会一次又一次地重置
launch timer (2 mins) → on mouse move ↓ → timer fires → shutdown app
↑ ← restart timer ←
关机与重启
当倒计时结束时,我不确定你是否打算关闭、重新启动或只是重新初始化应用程序中的某些状态。如果是最后一个(重新初始化状态),请将计时器设置为重复启动,而不是一次。方法的其余部分保持不变
可能的优化
我不确定,但我怀疑在每次鼠标移动时重置计时器可能会有点过头,可能会降低性能。您可以自己查看个人资料。如果确实存在重大成本,只需跟踪上次重置计时器的时间。要跟踪该时刻,请使用对象。调用以捕获每次鼠标移动的当前时刻。使用计算经过的时间。当超过任意限制(例如5秒)时,重新启动Swing计时器,并更新存储的“计时器上次重新启动的时间”Instant
<代码>即时。现在
以Java 8的分辨率和Java 9及更高版本的分辨率捕获当前时刻。(一个瞬间
实际上是有效的,但是传统的计算机时钟不能运行得那么好。)你能分享一下你到目前为止所做的事情吗?是的,我已经添加了我的代码。我使用5000ms测试Swing不是线程安全的,您不应该使用java.util.Timer
执行此任务,而是使用SwingTimer
谢谢您的回答。我可以保留mouseMotionListener并使用Swing计时器吗?请查看: