我有一个 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();
}
}
}
您所要做的就是使用以下命令将“一旦空闲”可运行对象推送到 EventQueue 的实例runOnceIdle()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)