我有一个配置串口连接的swing工作器。这个过程需要不确定的时间才能完成,有时需要1分钟的时间才能完成。使用Java Swing进行线程处理
我的问题出现在用户单击需要配置数据的按钮,而工作线程仍在配置时。
我想知道如何执行用户的请求只有当工作线程已完成。否则,如果工作者线程仍然活着,我希望执行等待工作线程完成。
我有一个配置串口连接的swing工作器。这个过程需要不确定的时间才能完成,有时需要1分钟的时间才能完成。使用Java Swing进行线程处理
我的问题出现在用户单击需要配置数据的按钮,而工作线程仍在配置时。
我想知道如何执行用户的请求只有当工作线程已完成。否则,如果工作者线程仍然活着,我希望执行等待工作线程完成。
添加PropertyChangeListener
到SwingWorker
,那么你可以决定的status from SwingWorker
have to implemented get()
in the SwingWorker
's method done()
,否则是不可能从调用的方法
得到exeption(S)依赖的代码,但我怀疑是否有可能改变设置,直到当前线程结束,更好的可能是SwingWorker#cancel()
,然后重新启动此实例
+1基本上是正确的 - 下一个+10会代表一些示例代码(或者链接到您的示例之一:-) – kleopatra
你可以检查你的按钮ActionEvent
如果task.isDone()
- 在任务是你SwingWorker
- 继续只有当它是真实的。但你可能想要显示一个弹出窗口或其他东西,否则用户可能会困惑为什么没有发生。
另一个简单的解决方案是在任务运行时将按钮暴露并将其禁用,并在完成时再次启用它。然后用户不能点击按钮,直到准备就绪。
还考虑允许按钮取消工作人员,如[此处]所示(https://sites.google.com/site/drjohnbmatthews/randomdata)。 – trashgod
将按钮的动作的启用属性绑定到工作者(成功)的终止f.i.在一个propertyChangeListener给工作人员(如@mKorbel建议) – kleopatra
我以不同的方式解决了这个问题,该按钮从外部系统获取数据,因此我不得不将另一个线程放入动作侦听器的actionPerformed(ActionEvent e)中。 – Lai
很高兴你能够正常工作:-)无论你做什么,都要确保你只在EDT上访问所有组件/属性。 – kleopatra