我一直试图找到这个问题的解决方案。编写swing事件缓冲区的最佳做法是什么?这个想法是当从鼠标手势触发动作时,例如'mouseMoved',因为事件可能被多次触发,我只想触发最后一次调用 - 例如,
如果鼠标被点击五次,而第一次点击监听器正在执行,而四个排队,则下一个呼叫将是第五个 - 所有先前的呼叫将被跳过。
似乎我应该使用Executor类,因为它可以删除未提交的任务,但我仍然不太确定。所有帮助表示赞赏!
答案 0 :(得分:2)
user1291492是对的,这根本不应该发生。您应该永远运行任何可能需要花费超过几毫秒才能在事件处理程序中完成的代码。 SwingWorker documentation包含有关如何执行此操作的示例和说明。最重要的报价是
不应在Event Dispatch Thread上运行耗时的任务。否则应用程序将无响应。
为了解决原始问题,我通常采用两种模式:
使用标记来标记将来某个时刻应执行的操作。如果有一段时间没有其他工作,我会检查所有标志,重置它们并执行相应的操作。
在为工作线程安排工作时,请保留对它的引用。每次安排新工作之前,请取消之前安排的工作。最常用于C#/ Async中的CancellationTokens。