java - SwingUtilities InvokeLater-什么被认为是不好的做法?

标签 java multithreading swing invokelater edt

我有一个问题,关于使用 SwingUtilities 的 invokeLater 方法的正确做法是什么。

因此,首先,我想确认我的理解是否正确。

据我所知,必须在 EDT 上更改 GUI,因为 Swing 组件不是线程安全的。 invokeLater 方法将 Runnable 作为参数,该 runnable 中包含的任何内容都将在 EDT 上运行。因此,对 Swing 组件的任何调用都被放入一种队列中,这些队列在 EDT 上一次执行一个。

除此之外,我的问题是:使用它的最佳做法是什么?据我所知,至少有两种方法可以做到:

1) 在 main 方法中,将所有代码,例如 GUI 创建、 Controller 创建,甚至模型创建(假设是 MVC 类型模式)放在由invokeLater 方法。当然,这是假设模型中任何长时间运行的任务都将使用 SwingWorker 执行。

2) 将 GUI 创建放在 invokeLater 中,但将 Controller 创建和模型创建放在 main 方法中。然后,无论何时您需要从 Controller 访问 Swing 组件,您都可以在 invokeLater 方法中弹出所述代码以将其放入 EDT 队列。

这两者中哪一个被认为是最佳实践或不良实践?如果这两者都不好,那么解决这个问题的更好方法是什么?

如有任何信息,我们将不胜感激。

谢谢。

最佳答案

这确实是一个有趣的问题,而公认的答案并没有完全回应它。

您建议的两种方法都可以接受并且会很好地工作,但我相信第一种比第二种方法(在 EDT 上全部执行,如果有一些长时间运行的任务在 SwingWorker 或新线程(如果它们与 Swing 无关)上执行它们)。


为什么? 正如@ThomasKrägler 指出的那样 here :

While you could split these tasks (model, controller and view creation) between main thread and EDT (and possibly gain a few milliseconds until the UI is first shown) it would also complicate the design of the application (multithreading is no easy topic) and litter the code base with invokeLater() calls.

请注意,在模型和 Controller 初始化(并因此启动 View )之前,EDT 不需要处理任何内容。因此您可以使用 EDT 来初始化它们,因为它不会对您的 UI 产生任何负面影响(目前还没有 UI)。

这样做,您将节省大量的 invokeLater 调用和忘记调用 invokeLater 的可能错误。您的代码也会看起来更简洁。

关于java - SwingUtilities InvokeLater-什么被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62208357/

相关文章:

java - 正则表达式与打印精美的文件不匹配

python - 异常后恢复Python程序?

java - 如何中断给定 Future 对象的线程?

java - 将 JScrollPane 添加到 JFrame

java - 在java中加载图像非常慢

java - 从 AccessDB 中提取数据时出现的问题

java - Apache POI - 允许使用时间字符串进行计算

java - 我可以查看 Java 序列化对象进行调试吗?

Java线程困惑,为什么输出没有顺序?

java - org.apache.poi 中缺少 ENUM