【问题标题】:Java reset timertask based on a mouse movementJava基于鼠标移动重置timertask
【发布时间】:2020-12-01 08:13:14
【问题描述】:

我有一个 Java Swing 组件,它每 1 分钟打印一次“hello”。

timer = new Timer();
timer.schedule(new HelloWordTask(), TIME, TIME);

但是,我想在用户移动鼠标时重置 timertask。

int count = 0;
private CustomMouseAction extends MouseAdapter {
   @Override
   public void mouseMoved(MouseEvent e) {
       timer.cancel();
       timer = new Timer();
       timer.schedule(new HelloWordTask(), TIME, TIME);
       System.out.println("moved " + count++);
   }
}

每当我移动鼠标时,我的计时器都会重新安排,这是预期的行为。但是,这意味着为每个“位”运动创建新的计时器。例如,当我将鼠标移动 5 厘米左右时,会显示约 30 条打印语句。

有没有办法让程序更有效率?此外,是否有可能以某种方式“降低”mouseMoved 检测率?例如,我可以让它只被调用 10 次而不是被调用 30 次(我假设如果这是可能的,那么有很小的机会错过刷新机会)。

【问题讨论】:

  • 首先,java.util.Timer 可能不是最好的解决方案,您可以考虑改用java.swing.Timer。接下来,您可以在mouseMoved 中有一个计数器,它仅在超过给定阈值时重置计时器 - 甚至第二个Timer 将在指定延迟后触发第一个,但不会运行重置

标签: java swing mouseevent timertask


【解决方案1】:

使用不同的 n 值进行测试,直到您满意为止。

int count = 0, lastX = 0, lastY = 0, n = 30;
private CustomMouseAction extends MouseAdapter {
   @Override
   public void mouseMoved(MouseEvent e) {
       int ix= e.getX();
       int iy= e.getY();
       if (Math.abs(lastX-ix)<n && (Math.abs(lastY-iy)<n) return;
       lastX= ix;
       lastY= iy;
       timer.cancel();
       timer = new Timer();
       timer.schedule(new HelloWordTask(), TIME, TIME);
       System.out.println("moved " + count++);
   }
}

【讨论】:

    【解决方案2】:

    例如,当我将鼠标移动 5 厘米左右时,会显示约 30 条打印语句。

    有没有办法让程序更有效率?

    这就是事件驱动编程的重点。操作系统生成事件,以便您知道用户正在做某事。您无法控制事件的生成频率。您只能控制您在事件生成时所做的处理。

    但是,这意味着为每个“位”移动创建新的计时器。

    1. 您不应该使用 util.Timer。相反,您应该使用javax.swing.Timer
    2. 不要在 mouseMoved() 方法中不断创建新的Timer。相反,当您的框架可见时,您应该创建并启动Timer。然后在 mouseMoved() 方法中调用Timerrestart() 方法。

    请参阅:Application Acvitity,了解可能对您有帮助的可重用类。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2011-07-17
      相关资源
      最近更新 更多