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.invokeAndWaitSwingUtilities.invokeLater或者 – 在使用SwingWorker – 通过publish (来自doInBackground )在EDT中执行它们。 在由EDT执行的SwingWorkerprocess方法中,您可以访问GUI。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

就个人而言,我发现invokeLaterinvokeAndWait在很多情况下都更容易使用。 SwingWorker可以用于例如进度条。