如果鼠标没有移动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 Timer(javax.swing.Timer
)而不是普通的Timer(java.util.Timer
)。见Oracle Tutorial。
Swing Timer的特殊之处在于它会自动处理背景上的计时器滴答,当最终触发时,计时器会自动处理在Swing的主GUI线程上运行您的任务。因此,您无需关心线程的细节。
永远不要在后台线程上访问GUI小部件非常非常重要。您可能会侥幸成功,或者您可能会彻底破坏您的应用程序。 Swing Timer的发明是为了处理在后台线程上倒计时的工作,然后切换回GUI线程来运行任务的代码。
TimerTask
关闭你的应用程序写下你的工作要完成定时器作为java.util.TimerTask
。
Swing Timer可以一次或多次触发。你想要开火一次。一旦开火,关闭你的应用程序。
在您的应用启动时设置计时器。在您的应用上存储该计时器的引用。为您想要的2分钟倒计时配置计时器。每次鼠标移动时,在Swing Timer上调用restart
。所以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
以Java 8中的milliseconds分辨率和Java 9及更高版本中的microseconds分辨率捕获当前时刻。 (一个Instant
实际上持有nanoseconds,但传统的计算机时钟不能运行那么好。)
到目前为止,这是我的解决方案:你可以创建一个自己的Thread
,它可以睡2秒钟。如果这个时间结束了,你可以随心所欲。如果鼠标移动,你可以interrupt
Thread
并重复:
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.");
}
}
}
}