如果鼠标移动,则重新启动计时器

时间:2019-03-14 23:07:23

标签: java swing timer restart

如果鼠标没有移动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);
        }
    });

2 个答案:

答案 0 :(得分:3)

Swing Timer

您要使用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计时器,并更新您存储的“计时器最后一次重新启动的时间” InstantInstant.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();
    }
}