有一段时间我一直在尝试寻找这个问题的解决方案。编写 Swing 事件缓冲区的最佳实践是什么?这个想法是当从鼠标手势触发操作时,例如“mouseMoved”,因为事件可能会被多次触发,我只想触发最后一次调用 - 例如,
如果鼠标被单击五次,而第一个单击监听器正在执行,并且四次已排队,则下一次调用将是第五次 - 所有先前的调用都将被跳过。
看来我应该使用 Executor类,因为它可以删除未提交的任务,但我仍然不太确定。感谢所有帮助!
最佳答案
user1291492 是对的,这种情况根本不应该发生。您不应该在事件处理程序中运行任何可能需要超过几毫秒才能完成的代码。 SwingWorker documentation包含有关如何操作的示例和说明。最重要的引言是
Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
为了解决最初的问题,我通常采用两种模式:
使用标志来标记应该在将来某个时刻执行的操作。当一段时间内没有其他工作时,我会检查所有标志,重置它们并执行适当的操作。
为工作线程安排工作时,保留对其的引用。每次在安排新的工作之前,先取消之前安排的工作。最常与 C#/Async 中的 CancellationToken 一起使用。
关于java - 如何为Java Swing MouseEvent编写事件缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416597/