如何在Swing中分析EDT?

我有一个应用程序,我正在Swing中构建。 它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程是顺利的,除了有时UI将暂停约750毫秒,我不知道为什么。 这并不总是会发生 – 但有时在应用程序中会发生某些事情,并且每隔6-8秒就开始暂停一次。

很明显,EDT上有一些事件需要750毫秒才能运行,这不应该发生。

我如何具体地描述EDT? 我真正想要做的是每当事件在EDT上运行时,将事件所花费的总时间量输出到日志或System.out。 有没有办法做到这一点?

或者是否有一些工具可以为我做这个并给我一个在EDT上运行的所有内容的日志以及需要多长时间?

我想通过这个日志,查看花费很长时间的所有内容,并找到问题所在。

看看这个问题 。 它描述了EDT上的简单日志。

创建一个这样的类:

public class TimedEventQueue extends EventQueue { @Override protected void dispatchEvent(AWTEvent event) { long startNano = System.nanoTime(); super.dispatchEvent(event); long endNano = System.nanoTime(); if (endNano - startNano > 50000000) System.out.println(((endNano - startNano) / 1000000)+"ms: "+event); } } 

然后用自定义类替换默认的EventQueue:

 Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue()); 

确保在EDT中仅运行与GUI相关的操作,并且在EDT中没有长时间运行的任务。 有一个很棒的工具叫做SwingExplorer,它有一个监控EDT操作的function。 希望这会有所帮助。

我会说这可能不是EDT上的实际内容,而是垃圾收集。

假设是这种情况我不知道任何解决方案我害怕。 我实际上从未在Swing中写过偶尔没有这种行为的东西。

要尝试和调试,您可以inheritanceEventQueue并使用以下命令安装新的:

。Toolkit.getDefaultToolkit()getSystemEventQueue()推(XXX)。

这应该可以让您至少看到EDT正在处理哪些事件。