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

问题描述 投票:1回答:2

如果鼠标没有移动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);
        }
    });
java swing timer restart
2个回答
3
投票

Swing Timer

你想使用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计时器,并更新你存储的“当计时器上次重启时”InstantInstant.now以Java 8中的milliseconds分辨率和Java 9及更高版本中的microseconds分辨率捕获当前时刻。 (一个Instant实际上持有nanoseconds,但传统的计算机时钟不能运行那么好。)


0
投票

到目前为止,这是我的解决方案:你可以创建一个自己的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.");
            }
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.