多次通过点击挥动按钮更改标签文本无法正常工作

我需要通过一次点击按钮改变jlabel.text几次。 在这段代码中,我需要设置标签文本在dowork()函数之前启动并在中间设置为正在进行中并在dowork()之后将其设置为结束(jlabel和dowork中的状态类型长时间执行):

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { status.setText("start"); try { Thread.sleep(10000); } catch (InterruptedException ex) { Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); } status.setText("in progress"); dowork(); try { Thread.sleep(10000); } catch (InterruptedException ex) { Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex); } status.setText("end"); } 

在此代码状态中,仅设置为end并且start不显示。

我会尝试使用SwingWorker实例(特别是其doInBackground方法)来执行您在doWork上与主UI线程不同的线程上执行的操作。 它的编写方式,您的侦听器方法必然会在执行期间冻结用户界面,正如您所说,这可能需要很长时间,从而导致糟糕的用户体验。

更改为JLabel文本可能发生在三个不同的地方:首先,在调用execute开始(即启动) SwingWorker ; 第二,使用SwingWorker提供的publish / process机制在用户界面上发布中间结果; 第三,在done方法中,只要SwingWorker完成了doInBackground方法的执行,就会在UI线程上再次调用它。

参考资料:Oracle关于工作线程的教程和SwingWorkerSwingWorker类的 JavaDoc API 文档 。

永远不要在ETD使用Thread.sleepThead.yield

永远不要在ETD执行任何阻止操作,例如扩展IO或数据处理

标签未更改的原因是因为您正在停止/阻止ETD ,从而阻止它处理任何重绘请求。

查看Swing中的并发和事件调度线程