我需要通过在swing中单击按钮多次更改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 线程不同的线程。按照它的编写方式,您的监听器方法必然会在执行期间卡住用户界面,正如您所说,这可能会花费很长时间,从而导致糟糕的用户体验。
对 JLabel
文本的更改可以在三个不同的地方发生:首先,在调用(即启动)SwingWorker
上的 execute
之前;其次,使用 SwingWorker
提供的 publish
/process
机制在用户界面上发布中间结果;第三,在 done
方法中,一旦 SwingWorker
完成其 doInBackground
方法的执行,就会在 UI 线程上再次调用该方法。
引用文献:Oracle关于worker threads and SwingWorker
的教程, JavaDoc API documentation of the SwingWorker
class .
关于java - 多次通过单击 swing 中的按钮更改标签文本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11656927/