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 SwingWorker
instance (in particular its doInBackground
method) to do what you are currently doing in doWork
on 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 JLabel
text can happen in three different places: first, just before invoking execute
on (i.e. starting) the SwingWorker
; second, using the publish
/process
mechanism that SwingWorker
makes available to publish intermediate results on the user interface; third, in the done
method, which is called again on the UI thread as soon as the SwingWorker
has finished the execution of its doInBackground
method.
References: Oracle's tutorial on worker threads and SwingWorker
, JavaDoc API documentation of the SwingWorker
class.