如果鼠标没有移动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);
}
});
答案 0 :(得分:3)
您要使用Swing计时器(javax.swing.Timer
)而不是通用计时器(java.util.Timer
)。参见Oracle Tutorial。
Swing计时器的特殊之处在于它会自动处理在后台计时的计时器,并且在最终触发时,计时器会自动处理在Swing的主GUI线程上运行任务。因此,您不必担心线程的细节。
非常非常重要永远不要在后台线程上访问GUI小部件。您可能不使用它,或者可能彻底破坏您的应用程序。 Swing计时器的发明是为了处理在后台线程上递减计数但又切换回GUI线程来运行任务代码的繁琐工作。
TimerTask
关闭应用程序将您的工作写成java.util.TimerTask
来触发计时器。
Swing计时器可以触发一次或重复触发。你想开除一次。触发后,关闭您的应用程序。
在应用启动时设置计时器。在您的应用中存储对该计时器的引用。将计时器配置为所需的2分钟倒计时。每次鼠标移动时,在Swing计时器上调用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,但是传统的计算机时钟无法正常运行。)
答案 1 :(得分:0)
到目前为止,这是我的解决方案:
您可以创建自己的React
,它会休眠2秒钟。如果这段时间结束了,您可以做任何您想做的事。如果鼠标移动了,您可以Thread
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();
}
}