我有一个应用程序,我正在Swing中构建。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程是顺利的,除了有时UI将暂停约750毫秒,我不知道为什么。这并不总是会发生 - 但有时会在应用程序中发生某些事情,并且每隔6-8秒开始暂停一次。
似乎很清楚,EDT上有一些事件正在运行750毫秒左右,这应该不会发生。
我如何特别对此EDT进行分析?我真正想要做的是每当事件在EDT上运行时,将事件所花费的总时间量输出到日志或System.out。有没有办法做到这一点?
或者是否有一些工具可以为我做这个并给我一个在EDT上运行的所有东西的日志以及需要多长时间?
我想查看这个日志,查看花费很长时间的所有内容,然后找出问题。
答案 0 :(得分:9)
看看这个question。它描述了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());
答案 1 :(得分:0)
确保您在EDT中仅运行与GUI相关的操作,并且在EDT中没有长时间运行的任务。有一个很棒的工具叫SwingExplorer,它有一个监控EDT操作的功能。希望这会有所帮助。
答案 2 :(得分:0)
我认为这可能不是EDT上的实际内容,而是垃圾收集。
假设是这种情况我不知道任何解决方案我害怕。我实际上从未在Swing中写过任何偶尔没有这种行为的东西。
尝试&调试你可以继承EventQueue&使用以下方法安装新的
Toolkit.getDefaultToolkit()getSystemEventQueue()推(XXX);
这应该可以让您至少看到EDT正在处理哪些事件。