java - 检查线程是否需要 EDT?

标签 java swing events event-dispatch-thread

我有一个用 Swing 实现的 UI。一个组件执行一些可能需要一些时间的工作,因此我使用 SwingUtilities.invokeLater。但是,我在阅读一些旧代码时在 ActionListener 中发现了这个:

if (!SwingUtilities.isEventDispatchThread()) {
    SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             // code X
         }
    });
} else {
   // code X
}

我认为这是有道理的,因为它将 code X 与 EDT 分开。但是,我发现它很容易出错,因为我已经使用了几次,而且两次都忘记了 else 部分。

问题是:是否需要检查 SwingUtilities.isEventDispatchThread()?或者我可以假设我不在 EDT 中并且总是使用invokeLater吗?

非常感谢。

最佳答案

即使您在 EDT 上,稍后调用也没有问题,但是它肯定会改变事件的时间安排,因此您必须确保在 EDT 上时您不依赖于此处的代码顺序。也就是说,避免忘记 else 的一个简单方法是将调用包装在一个实用方法中:

public static void invokeInDispatchThreadIfNeeded(Runnable runnable) {
    if (EventQueue.isDispatchThread()) {
        runnable.run();
    } else {
        SwingUtilities.invokeLater(runnable);
    }
}

这样你就永远不会忘记 else

此外,一般来说,在您的惯用语中重复 code x 是一个非常糟糕的主意,因为稍后您可能会发现您必须修复或改进该代码,而且您只会在一个地方进行,在另一个中留下错误。

关于java - 检查线程是否需要 EDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684049/

相关文章:

java - 如何让一个ImageView覆盖另一个View并在一定时间后隐藏?

java - 如何在 CardLayout 中显示特定的滚动 Pane ?

.net - Windows 窗体的 CheckBox CheckedChanged 与 CheckStateChanged

events - Dojo:主题与事件,应该考虑哪些设计注意事项?

javascript - 如何在 Javascript 中将事件连接到 HTML 元素?

java - 如何编写 Jersey Multipart webapp,Tomcat 服务器

java - 从使用 .net 编写的文件中读取字符

java - 这个 Intent 有什么问题?

java - 动态 JTree 和 SwingUtilities.invokeLater() 什么都不做

java - 添加到 JPanel 的项目未显示