I need to change jlabel.text several times by one click button in swing. In this code i need set label text to start before dowork() function and set to in progress in middle and set it to end after dowork() (status type in jlabel and dowork has long time execution) :
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");
}
In this code status only set to end and start doesn’t show.
I would try to use a
SwingWorkerinstance (in particular itsdoInBackgroundmethod) to do what you are currently doing indoWorkon a different thread than the main UI thread. The way it’s written, your listener method is bound to freeze the user interface during execution, which, as you said, can be a long time, resulting in a bad user experience.Change to
JLabeltext can happen in three different places: first, just before invokingexecuteon (i.e. starting) theSwingWorker; second, using thepublish/processmechanism thatSwingWorkermakes available to publish intermediate results on the user interface; third, in thedonemethod, which is called again on the UI thread as soon as theSwingWorkerhas finished the execution of itsdoInBackgroundmethod.References: Oracle’s tutorial on worker threads and
SwingWorker, JavaDoc API documentation of theSwingWorkerclass.