SwingUtilities.invokeLater
我的问题与.我应该何时使用它?我是否必须在每次需要更新 GUI 组件时使用?它到底有什么作用?有没有替代它,因为它听起来不直观,并且添加了看似不必要的代码?SwingUtilities.invokeLater
我的问题与.我应该何时使用它?我是否必须在每次需要更新 GUI 组件时使用?它到底有什么作用?有没有替代它,因为它听起来不直观,并且添加了看似不必要的代码?SwingUtilities.invokeLater
我是否必须在每次需要更新 GUI 组件时使用?
否,如果您已经在事件调度线程 (EDT) 上,则不会,在响应用户启动的事件(如单击和选择)时,情况总是如此。(方法等始终由EDT调用。actionPerformed
但是,如果您不在EDT上并且想要进行GUI更新(如果要从某个计时器线程或从某些网络线程等更新GUI),则必须安排由EDT执行更新。这就是这种方法的用途。
摆动基本上是线程不安全的。也就是说,与该API的所有交互都需要在单个线程(EDT)上执行。如果您需要从另一个线程(计时器线程,网络线程等)进行GUI更新,则需要使用您提到的方法(SwingUtilities.invokeLater,SwingUtilities.invokeAndWait,...)。
Swing is single threaded and all changes to the GUI must be done on EDT
基本用法invokeLater()
主要方法应始终包装在invokeLater()
延迟(但异步)操作/事件到 的末尾,EventQueue
如果 EDT 不存在,则必须使用 创建新的 EDT。您可以使用以下命令进行测试invokeLater()
if (SwingUtilities.isEventDispatchThread()) {...
存在,但直到今天我(只是我的观点)都找不到使用代替的理由,除了对GUI(JTree和JTable)的硬更改,但只是使用Substance L&F(非常适合测试EDT上事件的一致性)invokeAndWait()
invokeAndWait()
invokeLater()
基本内容:Swing 中的并发性
后台任务的所有输出都必须包装在invokeLater()