4

我有一个正在 Swing 中构建的应用程序。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程都很流畅,只是有时 UI 会暂停大约 750 毫秒,我不知道为什么。这并不总是发生 - 但有时应用程序中会发生一些事情,它每 6-8 秒开始像这样暂停一次。

似乎很清楚,在 EDT 上放置了一些需要 750 毫秒左右才能运行的事件,这不应该发生。

我如何像这样专门分析 EDT?我真正想做的是每次事件在 EDT 上运行时都会输出到日志或 System.out 以及事件所花费的总时间。有没有办法做到这一点?

或者是否有一些工具可以为我执行此操作并给我记录在 EDT 上运行的所有内容以及需要多长时间?

我想通过这个日志,查看所有需要很长时间的内容,然后找到问题所在。

4

3 回答 3

9

看看这个问题。它描述了 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());
于 2011-04-04T16:56:33.617 回答
0

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

于 2011-04-04T16:42:11.697 回答
0

我想说这可能实际上不是 EDT 上的东西,而是垃圾收集。

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

要尝试和调试,您可以继承 EventQueue 并使用以下方法安装一个新的:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(xxx);

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

于 2011-04-04T16:44:43.077 回答