java SwingWorker.doInBackground()不能访问GUI元素

时间:2012-01-24 07:47:46

标签: java swing swingworker event-dispatch-thread

可能这是微不足道的,我很难理解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封闭,不是缺陷)

1 个答案:

答案 0 :(得分:11)

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

相反,将更改包装在Runnable中并通过SwingUtilities.invokeAndWaitSwingUtilities.invokeLater或 - 在使用SwingWorker时通过publish在EDT中执行更改(来自doInBackground)。在由EDT执行的process SwingWorker方法中,您可以访问GUI。

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

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