可能这是微不足道的,我正在努力理解关于 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.invokeAndWaitSwingUtilities.invokeLater 或 - 当使用 SwingWorker - 通过 publish (来自 doInBackground )在 EDT 中执行它们。在由 EDT 执行的 processSwingWorker 方法中,您可以访问 GUI。

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

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

关于java SwingWorker.doInBackground() 不能访问 GUI 元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8983517/

10-13 00:24