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

Jay*_*yan 7 java swing swingworker event-dispatch-thread

可能这是微不足道的,我很难理解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().我怀疑这导致我异常几乎与 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181(11-Closed,not a defect)相同

Ano*_*sse 11

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

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

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

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