Pau*_*rth 3 java swing awt event-dispatch-thread awt-eventqueue
我有一个越来越慢的 GUI 应用程序。我想开始为各种 GUI 任务引入计时——但是,我们的许多 GUI 操作会触发其他操作,然后“稍后调用”以触发其他操作。
最终,一切都安定下来,没有什么可做的了。此时,我想停止计时器并报告 GUI“动作”花费了多长时间。
我认为这样做的方法是实现一个名为invokeOnceIdle(Runnable task). 只有当 AWTEventQueue 为“空”时,该方法才会执行提供的任务。即提供的“任务”应该是队列中的最后一件事。
这样做的一种方法是,是否有一种方法可以指定“最低”优先级SwingUtilities.invokeLater- 但这是不可能的。
我接下来查看是否可以“invokeLater”一个 Runnable 来检查事件队列是否为“空”——但是没有公共方法可以查看事件队列是否真的为空。
做到这一点的最佳方法是什么?
使用您自己的事件队列,您可以轻松实现该目标。这是我做的一些东西,应该让你去:
private static class MyEventQueue extends EventQueue {
private Deque<Runnable> onceIdle = new LinkedList<Runnable>();
public MyEventQueue() {
Toolkit.getDefaultToolkit().getSystemEventQueue().push(this);
}
public void runOnceIdle(Runnable toRun) {
onceIdle.addLast(toRun);
}
@Override
protected void dispatchEvent(AWTEvent event) {
super.dispatchEvent(event);
if (peekEvent() == null) {
for (Runnable toRun : onceIdle) {
toRun.run();
}
onceIdle.clear();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您所要做的就是使用 runOnceIdle()