我需要在摇摆中通过一个单击按钮多次更改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不显示。
答案 0 :(得分:2)
永远不要在Thread.sleep
Thead.yield
,ETD
从不,永远不要在ETD
中执行任何阻止操作,例如扩展IO或数据处理
标签未更改的原因是您正在停止/阻止ETD
,阻止它处理任何重新绘制请求。
答案 1 :(得分:2)
我会尝试使用SwingWorker
实例(特别是其doInBackground
方法)在与主UI线程不同的线程上执行您在doWork
中正在执行的操作。它的编写方式,你的监听方法必然会在执行过程中冻结用户界面,正如你所说,这可能需要很长时间,导致糟糕的用户体验。
更改为JLabel
文本可能发生在三个不同的地方:首先,在调用execute
之前(即开始)SwingWorker
;第二,使用publish
可用的process
/ SwingWorker
机制在用户界面上发布中间结果;第三,在done
方法中,只要SwingWorker
完成doInBackground
方法的执行,就会在UI线程上再次调用该方法。
参考资料:Oracle关于worker threads and SwingWorker
的教程,JavaDoc API documentation of the SwingWorker
class。