gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:46:30 26 4
gpt4 key购买 nike

我有一个问题,关于使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com