也许这很微不足道,我正在努力理解一个简单的文档摇摆工人 http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html.
这是复制粘贴的内容
Workflow
SwingWorker 的生命周期涉及三个线程:
当前线程:在此线程上调用execute()方法。它
安排 SwingWorker 在工作线程上执行并返回
立即地。我们可以等待 SwingWorker 完成使用
获取方法。
工作线程:在此线程上调用 doInBackground() 方法。
这是所有后台活动应该发生的地方。通知
关于绑定属性更改的 PropertyChangeListeners 使用
firePropertyChange 和 getPropertyChangeSupport() 方法。默认情况下
有两个可用的绑定属性:状态和进度。
事件派发线程:所有与 Swing 相关的活动都在此发生
线。 SwingWorker 调用 process 和 did() 方法并
通知该线程上的任何 PropertyChangeListener。
通常,当前线程是事件调度线程。
--
工作线程不是 EDT,因此 doInBackground() 中的代码不得访问 GUI 元素。我的理解正确吗?
背景:
我们有一些使用 SwingWorker 的小代码,但有 doInBackground() 创建 FileChooser 并调用setCurrentDirectory()
。我怀疑这导致我的异常几乎与https://bugs.java.com/bugdatabase/view_bug?bug_id=6637181 https://bugs.java.com/bugdatabase/view_bug?bug_id=6637181(11-关闭,不是缺陷)
是的。来自后台线程 - 常规线程和SwingWorker.doInBackground
请勿修改UI,以免造成各种麻烦。
相反,将更改包装在Runnable
并通过以下方式在 EDT 中执行它们SwingUtilities.invokeAndWait
, SwingUtilities.invokeLater
或 - 使用时SwingWorker
- via publish
(from doInBackground
)。内process
的方法SwingWorker
,由 EDT 执行,您可以访问 GUI。
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
就我个人而言,我发现invokeLater
and invokeAndWait
在许多情况下更容易使用。 SwingWorker 适合例如进度条。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)