SwingUtilities.invokeLater
有关。我应该在什么情况下使用它?每次更新GUI组件时都必须使用吗?它实际上是做什么的?是否有替代方法,因为它似乎不直观并且添加了看似不必要的代码?SwingUtilities.invokeLater
有关。我应该在什么情况下使用它?每次更新GUI组件时都必须使用吗?它实际上是做什么的?是否有替代方法,因为它似乎不直观并且添加了看似不必要的代码?每次需要更新GUI组件时,我都必须使用吗?
不是的,在处理用户发起的事件(如单击和选择)时,如果您已经在事件派发线程(EDT)上,每次更新GUI组件时都不需要调用该方法。(例如 actionPerformed 方法总是由 EDT 调用。)
但是,如果您不在EDT上并且想要进行GUI更新(例如,如果需要从某个定时器线程或某个网络线程中更新GUI),则必须使用该方法调度更新以由EDT执行。
Swing基本上是线程不安全的。也就是说,所有与该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,则必须使用invokeLater()
创建新的EDT。您可以使用if(SwingUtilities.isEventDispatchThread()) { ...
进行测试。
虽然存在invokeAndWait()
,但直到今天我(只是我的看法)仍然找不到使用invokeAndWait()
而不是invokeLater()
的理由,除了在GUI(JTree和JTable)中进行硬编码更改,但仅限于Substance L&F(对于测试EDT上事件一致性非常好)
基本内容:Swing并发性
来自后台任务的所有输出都必须包装在invokeLater()
中。
SwingUtilities.invokeLater
,我应该在什么时候使用它呢?invokeLater()
来显示桌面应用程序的主JFrame
,而不是尝试在当前线程中执行此操作。它还会为以后优雅地关闭应用程序创建上下文。invokeLater()
,只需正确设置组件上的监听器即可。invokeLater()
+在组件上感兴趣的侦听器显示应用程序更多的代码。其余部分由Swing处理。大多数用户启动的事件(点击、键盘)已经在EDT上,因此您不需要使用SwingUtilities。这涵盖了很多情况,除了您的main()线程和更新EDT的工作线程。
Control.BeginInvoke
的等价物。 - SLaksactionPerformed
方法是如何被调用的呢?由EDT!) 因此,当您说您只有一个线程时,我必须理解为您只有EDT(例如,您创建了GUI并从主方法中退出)。在这种情况下,否,您 不需要 使用invokeLater
。但是,您将无法进行任何“后台”处理。如果您这样做,将完全锁定GUI... - aioobe