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

贾扬:

可能这很简单,我正在努力了解有关SwingWorker的简单文档

这是复制粘贴的内容

工作流程

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

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

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

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

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

-

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

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

有QUIT-Anony-Mousse:

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

相反,包装在一个变化Runnable,并让它们通过在EDT执行SwingUtilities.invokeAndWaitSwingUtilities.invokeLater或-使用时SwingWorker-通过publish(从doInBackground)。EDT执行process方法中SwingWorker,您可以访问GUI。

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

就个人而言,我觉得invokeLaterinvokeAndWait更容易使用的许多情况。SwingWorker可以处理进度条。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章