Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java SwingWorker.doInBackground()不能访问GUI元素_Java_Swing_Swingworker_Event Dispatch Thread - Fatal编程技术网

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

java SwingWorker.doInBackground()不能访问GUI元素,java,swing,swingworker,event-dispatch-thread,Java,Swing,Swingworker,Event Dispatch Thread,可能这是琐碎的,我正在努力理解一个简单的文档 这是粘贴内容的副本 工作流程 SwingWorker的生命周期涉及三个线程: 当前线程:在此线程上调用execute()方法。信息技术 安排SwingWorker在工作线程上执行并返回 马上。可以等待SwingWorker使用 获取方法 工作线程:在此线程上调用doInBackground()方法。 所有后台活动都应该在这里进行。通知 PropertyChangeListeners关于绑定属性更改使用 firePropertyChange和getPr

可能这是琐碎的,我正在努力理解一个简单的文档

这是粘贴内容的副本

工作流程

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

当前线程:在此线程上调用execute()方法。信息技术 安排SwingWorker在工作线程上执行并返回 马上。可以等待SwingWorker使用 获取方法

工作线程:在此线程上调用doInBackground()方法。 所有后台活动都应该在这里进行。通知 PropertyChangeListeners关于绑定属性更改使用 firePropertyChange和getPropertyChangeSupport()方法。默认情况下 有两个绑定属性可用:状态和进度

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

通常,当前线程是事件分派线程

--

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

背景:
我们有一些使用SwingWorker的小代码,但是有doInBackground()创建FileChooser并调用
setCurrentDirectory()
。我怀疑导致我异常的原因与(11关闭,不是缺陷)

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

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


就我个人而言,我发现
invokeLater
invokeAndWait
在许多情况下更容易使用。SwingWorker可以使用进度条等工具。

谢谢-我们几乎在所有地方都按照您在答案中所写的操作。代码在某些方面使用swingworker。即使在这种情况下,处理也可以分为GUI访问部分和非GUI部分。正确进行拆分通常会提高性能并避免问题,因此强烈建议使用此选项。@Jayan教程讨论publish/process/done的输出,您可以测试(isEventDispatchThread)是否请阅读+1.