- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题,关于使用 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/
非常简单的应用程序 - 您可以复制 - 粘贴 - 运行。主要只是“创建”应用程序。 - 这不是问题(可能) #include #include #include #include typede
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
Haskell 有一个名为 seq 的神奇函数,它接受任何类型的参数并将其简化为弱头范式 (WHNF)。 我读过一些资料[但我现在不记得他们是谁了...],它们声称“多态 seq 很糟糕”。他们在哪些
我正在编写一个脚本,该脚本应该在一堆服务器周围运行并从中选择一堆数据,包括本地服务器。选择我需要的数据所需的 SQL 非常复杂,所以我正在编写一种临时 View ,并使用 OPENQUERY 语句来获
考虑以下代码: case class Vector3(var x: Float, var y: Float, var z: Float) { def add(v: Vector3): Unit =
我正在读这个SO post关于守护线程,答案底部的引述是: But joining a demonized thread opens most likely a whole can of troubl
在阅读有关 Google webtool 工具包的内容时,看到一条声明说“同步 RPC 不好”。他们有什么理由吗?我能想到的一个很好的理由是,对最终用户的响应可能会受到远程服务器延迟或网络问题的影
我有以下 HTML: A Simple Sample Web Page By Sheldon Brown Demonstrating a few HTML feat
我正在做一项简单的任务,但我陷入困境...... output 我需要使第一行与其他所有内容保持一致,但无论我做什么,它都不想接受空格。那么,我应该纠正什么以及为什么?谢谢 public static
我在系统中有一个类,其目的列为“这可以是从午夜算起的秒数。或者带有日期的时间。”我试图解释这有多糟糕,但我无法理解我的观点。有没有人对如何解决这个问题有任何想法。 http://code-slim-j
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: When are C++ macros beneficial? Why is #define bad and
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
始终建议通过将所有代码放在 JS 文件中来避免内联 Javascript 代码,该文件包含在所有页面中。我想知道,这是否不会导致繁重的页面出现性能问题。 例如,假设我们有几十个这样的函数 functi
我主要在 AngularJS 中进行开发,最近我正在研究 Vue.js 并阅读它的指南,在它提到的一页上: By default, all props form a one-way-down bind
我正在构建一个本地化目录,但遇到了设计难题。现在,目录存储一个 Dictionary存储翻译,其中 IString可以是两种类型:Singular或 Plural .这是 IString 的简化版本:
对于我的矩阵类,我做了: template class Matrix { private: std::array, Height> Elements; stat
MSDN documentation说 public class SomeObject { public void SomeOperation() { lock(this) {
建议不要在 Python 中使用 import *。 谁能分享一下原因,这样我下次就可以避免了? 最佳答案 因为它会将很多东西放入您的命名空间(可能会影响之前导入的一些其他对象,而您不会知道它)。 因
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
G'day, 这与my question on star developers有关并到 this question regarding telling someone that they're wri
我是一名优秀的程序员,十分优秀!