可能这是微不足道的,我正在努力理解关于 SwingWorker 的简单文档。
这是复制粘贴的内容
工作流程
SwingWorker 的生命周期涉及三个线程:
--
工作线程不是 EDT,因此 doInBackground() 中的代码不能访问 GUI 元素。我的理解正确吗?
背景:
我们有使用SwingWorker的小代码,但是有doInBackground()创建FileChooser并调用setCurrentDirectory()
。我怀疑这导致我的异常与 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 几乎相同(11-Closed,Not a Defect)
最佳答案
是的。从后台线程 - 常规线程和 SwingWorker.doInBackground
您不得修改 UI 以避免各种麻烦。
相反,将更改包装在 Runnable
中,并通过 SwingUtilities.invokeAndWait
、 SwingUtilities.invokeLater
或 - 当使用 SwingWorker
- 通过 publish
(来自 doInBackground
)在 EDT 中执行它们。在由 EDT 执行的 process
的 SwingWorker
方法中,您可以访问 GUI。
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
就个人而言,我发现 invokeLater
和 invokeAndWait
在许多情况下更易于使用。 SwingWorker 可以用于例如进度条。
关于java SwingWorker.doInBackground() 不能访问 GUI 元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8983517/