一尘不染

如何在Swing中配置EDT?

java

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

很显然,EDT上有一些事件需要花费750毫秒左右的时间才能运行,这不应该发生。

我如何特别像这样配置EDT?我真正想做的是获取在每次事件在EDT上运行时输出到日志或System.out的信息以及事件所花费的总时间。有没有办法做到这一点?

还是有一些工具可以帮我实现这一目标,并为我提供在EDT上运行的所有内容的日志以及需要多长时间?

我想浏览一下该日志,查看花费很长时间的所有内容,然后找出问题所在。


阅读 306

收藏
2020-12-03

共1个答案

一尘不染

创建一个这样的类:

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());
2020-12-03