7

可能这是微不足道的,我很难理解SwingWorker上的简单文档。

这是复制粘贴的内容

工作流程

SwingWorker 的生命周期涉及三个线程:

当前线程:在该线程上调用了 execute() 方法。它安排 SwingWorker 在工作线程上执行并立即返回。可以使用 get 方法等待 SwingWorker 完成。

工作线程:在该线程上调用 doInBackground() 方法。这是所有后台活动都应该发生的地方。要通知 PropertyChangeListener 绑定的属性更改,请使用 firePropertyChange 和 getPropertyChangeSupport() 方法。默认情况下,有两个可用的绑定属性:状态和进度。

事件调度线程:所有与 Swing 相关的活动都发生在该线程上。SwingWorker 调用 process 和 done() 方法并通知此线程上的任何 PropertyChangeListener。

通常,当前线程是事件调度线程。

--

工作线程不是 EDT,因此 doInBackground() 中的代码不得访问 GUI 元素。我的理解正确吗?

背景:我们有使用 SwingWorker 的小代码,但有 doInBackground() 创建 FileChooser 并调用setCurrentDirectory(). 我怀疑这导致我的异常与http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181几乎相同 (11-关闭,不是缺陷)

4

1 回答 1

13

是的。从后台线程 - 常规线程和SwingWorker.doInBackground您不得修改 UI 以避免各种麻烦。

相反,将更改包装在 a 中Runnable并让它们在 EDT via 中执行SwingUtilities.invokeAndWaitSwingUtilities.invokeLater或者 - 使用时SwingWorker- via publish(from doInBackground)。在 EDT 执行的process方法中SwingWorker,您可以访问 GUI。

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

就个人而言,我发现invokeLater并且invokeAndWait更容易在许多情况下使用。SwingWorker 适用于进度条等。

于 2012-01-24T07:55:15.297 回答