我有一个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次(我假设如果这是可能的,有一个很小的机会错过刷新机会)。
2条答案
按热度按时间cuxqih211#
使用不同的n值进行测试,直到您满意为止。
lvmkulzt2#
例如,当我将鼠标移动5厘米左右时,会显示大约30条打印语句。
有没有办法让这个计划更有效率?
这就是事件驱动编程的要点。操作系统生成事件,这样您就知道用户正在做什么。您无法控制事件生成的频率。您只能控制在生成事件时执行的处理。
然而,这意味着为每一个“位”的运动创建了新的计时器。
不应使用util.timer。相反,你应该使用
javax.swing.Timer
.不要一直创造一个新的世界
Timer
在mousemoved()方法中。相反,您应该创建并启动Timer
当你的框架可见时。然后在mousemoved()方法中调用restart()
方法Timer
.请参阅:可重用类的应用程序acvity,您可能会发现它很有用。