java - 如果鼠标正在移动,则重新启动计时器

标签 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);
        }
    });

最佳答案

Swing 计时器

您想使用 Swing 计时器 ( javax.swing.Timer ) 而不是普通计时器 ( java.util.Timer )。查看Oracle Tutorial .

自动线程

Swing 计时器的特殊之处在于它会自动处理背景上的计时器滴答声,当最终触发时,计时器会自动处理在 Swing 的主 GUI 线程上运行您的任务。所以你不必关心线程的细节。

永远不要在后台线程上访问您的 GUI 小部件是非常非常非常重要的。您可能侥幸逃脱,或者您可能会彻底破坏您的应用程序。 Swing Timer 的发明是为了处理在后台线程上倒计时但又切换回 GUI 线程以运行任务代码的繁琐工作。

TimerTask 关闭您的应用

将您在触发计时器时要完成的工作写为 java.util.TimerTask .

算法

Swing Timer 可以触发一次或重复触发。你想开火一次。触发后,关闭您的应用程序。

在您的应用启动时设置计时器。在您的应用程序中存储对该计时器的引用。为您想要的 2 分钟倒计时配置计时器。每次鼠标移动,调用restart在 Swing 计时器上。所以 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.nowmilliseconds 的分辨率捕获当前时刻在 Java 8 中,分辨率为 microseconds在 Java 9 及更高版本中。 (Instant 实际上包含 nanoseconds ,但传统的计算机时钟无法正常运行。)

关于java - 如果鼠标正在移动,则重新启动计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173333/

相关文章:

Java Swing 设置 "actual"帧大小(内部)

java - 创建一个简单的定时 Java 测验

java - Jframe中的计时器重新启动

android - 每隔 X 次用天文钟做一些事情

java - 如何在intellij上安装ibatis插件

java - 如何在 OnTouchListener 中获取初始 X、Y 值(第一次触摸 ACTION_DOWN)

java - 具有多行的表单元素

作为函数参数传递的 Java 对象

java - 在 Java 中初始化二维数组

java - Java JComponent 捕获鼠标事件,但未捕获按键事件