SwingUtilities.invokeLater

我的问题与.我应该何时使用它?我是否必须在每次需要更新 GUI 组件时使用?它到底有什么作用?有没有替代它,因为它听起来不直观,并且添加了看似不必要的代码?SwingUtilities.invokeLater


答案 1

我是否必须在每次需要更新 GUI 组件时使用?

否,如果您已经在事件调度线程 (EDT) 上,则不会,在响应用户启动的事件(如单击和选择)时,情况总是如此。(方法等始终由EDT调用。actionPerformed

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

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


答案 2
Swing is single threaded and all changes to the GUI must be done on EDT 

基本用法invokeLater()

  1. 主要方法应始终包装在invokeLater()

  2. 延迟(但异步)操作/事件到 的末尾,EventQueue

  3. 如果 EDT 不存在,则必须使用 创建新的 EDT。您可以使用以下命令进行测试invokeLater()if (SwingUtilities.isEventDispatchThread()) {...

  4. 存在,但直到今天我(只是我的观点)都找不到使用代替的理由,除了对GUI(JTree和JTable)的硬更改,但只是使用Substance L&F(非常适合测试EDT上事件的一致性)invokeAndWait()invokeAndWait()invokeLater()

  5. 基本内容:Swing 中的并发性

  6. 后台任务的所有输出都必须包装在invokeLater()