- 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/
有人可以强调这两者之间的区别以及两者都是必需的实例吗?! 我有一个可以互换使用的应用程序,但想知道一个是否比另一个更好。显然它们都接受 Runnable object,所以对我来说 - 我想我可以使用
EventQueue.invokeLater() 和 SwingUtilities.invokeLater() 有什么不同吗? 或者是后者只是为了设计而建立在前者之上(没有修改)? 最佳答案 没有没有
在我的方法 doWork() 中,我调用 SwingUtilities.invokeLater(new Runnable(){ public void run() { button.setBackgr
我怎么感觉SwingUtilities.invokeLater()在任何swing应用中的必要性。请给出一些代码示例。 最佳答案 每当您需要更新 GUI 中的某些内容时,您应该通过 AWT 事件线程
.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){
我按照教程创建了一个信使。我正确地输入了代码,并且我对所有内容的作用有相当基本的了解。 尽管如此,我最终并没有得到相同的结果。代码如下: public class Server extends JFr
是否有更优雅的方式来完成我在下面所做的事情?也就是说,是否有比轮询和 hibernate 、轮询和 hibernate 等更优雅的方式来知道何时 Runnable.run()方法已通过 invokeL
我在使用 invokeLater 更新 JLabel 值时遇到问题。我在运行 invokeLater 的主函数之外有一个单独的方法,但是当我单击搜索按钮更新值时,它不会在同一个 gui 实例中更新。我
我使用推荐的代码启动我的交互式程序,它使用 Swing。 : public static void main(String[] args) { javax.swing.Swin
EventQueue javadoc 声明要求排队的事件按顺序和顺序分派(dispatch)。 与 EventQueue.invokeLater 一起排队的 Runnable 保证在后续用户事件(例如
有时我觉得使用 AsyncTask 对任务来说太过分了,我正在寻找类似的功能,如 Android 中的 SwingUtilities.invokeLater。因为我只想执行一行代码,没有必要为此创建一
我的问题与 SwingUtilities.invokeLater 有关。我应该什么时候使用它?每次需要更新 GUI 组件时都必须使用吗?它究竟是做什么的?是否有替代方案,因为它听起来不直观并且添加了看
我有一个问题,关于使用 SwingUtilities 的 invokeLater 方法的正确做法是什么。 因此,首先,我想确认我的理解是否正确。 据我所知,必须在 EDT 上更改 GUI,因为 Swi
我有一个线程使用 SwingUtilities.invokeLater 在我的 JFrame 上显示更新。线程的速度是可调的,当它设置为全速(更新之间没有 sleep )时,我的程序会严重减慢。我想问
我从来不理解SwingUtilities.invokeLater,这就是我一直避免使用它直到现在的原因。但是确保 Swing Thread 安全非常重要。好吧,请原谅,因为这是我第一次这样做。我试图在
这个问题已经有答案了: What does SwingUtilities.invokeLater do? [duplicate] (5 个回答) SwingUtilities.invokeLater
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我正在使用 invokeLater() 在 JEditPane 中加载 html 页面,该 JEditPane 位于 JPanel 中,而 JPanel 位于 JTabbedPane 中。 我的所有方
I had a problem earlier我试图将对象添加到 Canvas 中,但 SwingUtilities.invokeLater 尚未真正完成其工作。我确实需要能够可靠地向此 JPanel
我正在尝试使用多线程模拟一个简单的恒温器。恒温器应提高温度以达到用户请求的值,即下面代码中的“最大值”。我有两个线程,一个负责提高温度,另一个负责降低温度。但减少的条件是必须在关气时才运行。但我在实现
我是一名优秀的程序员,十分优秀!