Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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
用javaswing实现线程_Java_Multithreading_Swing_Swingworker - Fatal编程技术网

用javaswing实现线程

用javaswing实现线程,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我有一个swing worker,它配置串行端口连接。这个过程需要一段不确定的时间才能完成,有时需要1分钟,有时需要更长的时间 当用户在工作线程仍在配置时单击需要配置数据的按钮时,就会出现我的问题 我想知道只有在工作线程完成时如何执行用户的请求。否则,如果工作线程仍处于活动状态,我希望执行等待工作线程完成。如果task.isDone()-其中task是您的SwingWorker,您可以检查按钮ActionEvent,并仅在其为真时继续。但是您可能希望显示一个弹出窗口或其他东西,否则用户可能会感到

我有一个swing worker,它配置串行端口连接。这个过程需要一段不确定的时间才能完成,有时需要1分钟,有时需要更长的时间

当用户在工作线程仍在配置时单击需要配置数据的按钮时,就会出现我的问题


我想知道只有在工作线程完成时如何执行用户的请求。否则,如果工作线程仍处于活动状态,我希望执行等待工作线程完成。

如果
task.isDone()
-其中task是您的
SwingWorker
,您可以检查按钮
ActionEvent
,并仅在其为真时继续。但是您可能希望显示一个弹出窗口或其他东西,否则用户可能会感到困惑,为什么什么都没有发生

另一个简单的解决方案是在任务运行时公开按钮并禁用它,然后在任务完成后再次启用它。然后,在按钮准备就绪之前,用户无法单击按钮。

  • PropertyChangeListener
    添加到
    SwingWorker
    ,然后您可以确定

  • ,否则无法从调用的方法中获取验证

  • 取决于代码,但我怀疑是否有可能更改设置,直到当前线程结束,最好是
    SwingWorker#cancel()
    ,然后重新启动此实例


将按钮的操作的enabled属性绑定到工作线程的(成功)终止,f.i.在propertyChangeListener到工作线程(正如@mKorbel所建议的)中,我解决了这个问题。不同的是,按钮从外部系统获取数据,因此我必须将其放在actionPerformed(ActionEvent e)中的另一个线程中很高兴它能正常工作:-)无论您做了什么,请确保仅在EDT上访问所有组件/属性。配置是在上完成的。这是一个缺点,因为加载UI需要相当长的时间。我想我将不得不接受这一点。它对我来说太复杂了。+ 1基本上是正确的-下一步+ 10会用到一些示例代码(或者链接到一个例子:-)也考虑允许按钮取消工作人员,如图所示。