java SwingWorker.doInBackground()不能访问GUI元素
可能这是微不足道的,我正在努力理解关于SwingWorker的简单文档。
这是复制粘贴的内容
工作流程
SwingWorker的生命周期涉及三个线程:
当前线程:在此线程上调用execute()方法。 它安排SwingWorker在工作线程上执行并立即返回。 可以等待SwingWorker使用get方法完成。
工作线程:在此线程上调用doInBackground()方法。 这是所有背景活动应该发生的地方。 要通知PropertyChangeListeners有关绑定属性的更改,请使用firePropertyChange和getPropertyChangeSupport()方法。 默认情况下,有两个绑定属性:状态和进度。
事件调度线程:此线程上发生所有与Swing相关的活动。 SwingWorker调用process和done()方法并通知此线程上的任何PropertyChangeListeners。
通常,Current线程是Event Dispatch Thread。
–
工作线程不是EDT,因此doInBackground()中的代码不能访问GUI元素。 我的理解是否正确?
背景:我们有使用SwingWorker的小代码,但有doInBackground()创建FileChooser并调用setCurrentDirectory()
。 我怀疑这导致我exception几乎与http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181(11-Closed,not a defect)相同
是。 从后台线程 – 常规线程和SwingWorker.doInBackground
您不能修改UI以避免各种麻烦。
相反,将更改包装在Runnable
并通过SwingUtilities.invokeAndWait
, SwingUtilities.invokeLater
或者 – 在使用SwingWorker
– 通过publish
(来自doInBackground
)在EDT中执行它们。 在由EDT执行的SwingWorker
的process
方法中,您可以访问GUI。
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
就个人而言,我发现invokeLater
和invokeAndWait
在很多情况下都更容易使用。 SwingWorker可以用于例如进度条。