首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwingUtilities.invokeLater

SwingUtilities.invokeLater
EN

Stack Overflow用户
提问于 2011-08-26 04:38:49
回答 5查看 34.8K关注 0票数 56

我的问题与SwingUtilities.invokeLater有关。什么时候使用好呢?每次需要更新GUI组件时都必须使用吗?它到底是做什么的?有没有替代它的方法,因为它听起来不直观,而且增加了看似不必要的代码?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-26 04:41:54

每次需要更新图形用户界面组件时都必须使用吗?

不,如果您已经在事件分派线程(EDT)上,当响应用户发起的事件(如点击和选择)时,就不会这样。( actionPerformed方法等始终由EDT调用。)

但是,如果您不在EDT上并且想要进行GUI更新(如果您想要从某个计时器线程或从某个网络线程等更新GUI ),则必须安排由EDT执行更新。这就是这个方法的目的。

Swing基本上是线程不安全的。即,与API所有交互都需要在单个线程( EDT)上执行。如果您需要从另一个线程(计时器线程、网络线程等)进行GUI更新您需要使用您提到的方法(SwingUtilities.invokeLater、SwingUtilities.invokeAndWait等)。

票数 53
EN

Stack Overflow用户

发布于 2011-08-26 05:00:11

代码语言:javascript
复制
Swing is single threaded and all changes to the GUI must be done on EDT 

invokeLater()的基本用法

  1. Main方法应该始终包装在invokeLater()
  2. Delayed (但异步地)操作/事件中,直到EventQueue
  3. 的末尾。如果EDT不存在,那么您必须使用invokeLater()创建一个新的EDT。你可以使用if (SwingUtilities.isEventDispatchThread()) {...
  4. There exists invokeAndWait()来测试它,但是直到今天我(只是我的观点)找不到使用invokeAndWait()而不是invokeLater()的原因,除了对图形用户界面(JTree & JTable)的硬性修改,而只是使用Substance L&F (非常适合在EDT上测试事件的一致性)
  5. Basic的东西:后台任务的just输出必须包装在EDT中
票数 14
EN

Stack Overflow用户

发布于 2011-08-26 04:57:10

每个Swing应用程序至少有两个线程:

执行application

  • The EDT (事件调度线程)的主线程是一个更新UI的线程(这样UI就不会冻结)。

如果您想要更新UI,您应该在EDT中执行代码。像SwingUtilities.invokeLater,SwingUtilities.invokeAndWait,EventQueue.invokeLater,EventQueue.invokeAndWait这样的方法允许你通过EDT执行代码。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7196889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档