java重置计时器任务

emeijp43  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(411)

我有一个javaswing组件,它每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条打印语句。
有没有办法让这个计划更有效率?此外,是否有可能以某种方式“降低”鼠标移动的检测率?例如,我可以让它只被调用10次,而不是被调用30次(我假设如果这是可能的,有一个很小的机会错过刷新机会)。

cuxqih21

cuxqih211#

使用不同的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++);
   }
}
lvmkulzt

lvmkulzt2#

例如,当我将鼠标移动5厘米左右时,会显示大约30条打印语句。
有没有办法让这个计划更有效率?
这就是事件驱动编程的要点。操作系统生成事件,这样您就知道用户正在做什么。您无法控制事件生成的频率。您只能控制在生成事件时执行的处理。
然而,这意味着为每一个“位”的运动创建了新的计时器。
不应使用util.timer。相反,你应该使用 javax.swing.Timer .
不要一直创造一个新的世界 Timer 在mousemoved()方法中。相反,您应该创建并启动 Timer 当你的框架可见时。然后在mousemoved()方法中调用 restart() 方法 Timer .
请参阅:可重用类的应用程序acvity,您可能会发现它很有用。

相关问题