Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果鼠标正在移动,请重新启动计时器_Java_Swing_Timer_Restart - Fatal编程技术网

Java 如果鼠标正在移动,请重新启动计时器

Java 如果鼠标正在移动,请重新启动计时器,java,swing,timer,restart,Java,Swing,Timer,Restart,如果鼠标在2分钟内没有移动,我想重新启动我的程序。 我试图设置一个计时器,并在每次鼠标移动时重新启动它,但到目前为止没有任何效果。 有人能帮我解决这个问题吗 frame.addMouseMotionListener(new MouseAdapter() { public void mouseMoved(MouseEvent e) { timer.cancel(); timer.purge(); timer =

如果鼠标在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秒。如果这段时间结束了,你可以做任何你想做的事。如果移动鼠标,您可以
中断
线程
并重复:

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
执行此任务,而是使用Swing
Timer
谢谢您的回答。我可以保留mouseMotionListener并使用Swing计时器吗?请查看: