我需要通过摆动中的一个单击按钮多次更改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"); }
在此代码状态下,仅设置为结束和开始不显示。
我将尝试使用SwingWorker实例(尤其是其doInBackground方法)在doWork与主UI线程不同的线程上执行当前正在执行的操作。按照编写方式,您的侦听器方法势必会在执行期间冻结用户界面,正如您所说的那样,这可能会很长一段时间,从而导致不良的用户体验。
SwingWorker
doInBackground
doWork
更改JLabel文本可以在三个不同的地方进行:首先,在调用execute(即开始)之前SwingWorker;其次,使用publish/ process机制SwingWorker在用户界面上发布中间结果;第三,在done方法中,在方法SwingWorker执行完毕后立即在UI线程上再次调用它doInBackground。
JLabel
execute
publish
process
done
参考资料:Oracle的有关工作线程SwingWorker的教程以及该类的 JavaDoc API 文档SwingWorker。