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