多次通过点击挥动按钮更改标签文本无法正常工作
我需要通过一次点击按钮改变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关于工作线程的教程和SwingWorker
, SwingWorker
类的 JavaDoc API 文档 。
永远不要在ETD
使用Thread.sleep
, Thead.yield
永远不要在ETD
执行任何阻止操作,例如扩展IO或数据处理
标签未更改的原因是因为您正在停止/阻止ETD
,从而阻止它处理任何重绘请求。
查看Swing中的并发和事件调度线程