Вы должны понимать, что в коде нет паузы (и не должно быть) между вашим звонком на
recognitionProgress.setString("Marking ROI...");
и
recognitionProgress.setString("Segmenting...");
за исключением миллисекунд, необходимых для завершения первого бита кода и достижения второго бита кода, и обе фоновые задачи, вероятно, происходят одновременно.
Варианты решения этой проблемы включают:
- Использование двух JProgressBars, по одному для каждой задачи,
- или выполнение обеих задач из одного SwingWorker, чтобы обе они могли выполняться в одном фоновом потоке и выполняться последовательно,
- или выполнение второй задачи после того, как слушатель изменения свойства первой задачи информирует вас о том, что первая задача завершена (свойство состояния возвращает SwingWorker.StateValue.DONE).
например.,
public void actionPerformed(ActionEvent ae) {
mainFrame.getGlassPane().setCursor(new Cursor(Cursor.WAIT_CURSOR));
recognitionProgress.setStringPainted(true);
BlueMarkerTask bmt = new BlueMarkerTask();
bmt.addPropertyChangeListener(PrismRunnable.this);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
recognitionProgress.setString("Marking ROI...");
}
});
bmt.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
if (pcEvt.getPropertyName().equals("state")) {
if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
// you'd probably have this in a method.
RecognitionTask rt = new RecognitionTask();
rt.addPropertyChangeListener(PrismRunnable.this);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
recognitionProgress.setString("Segmenting...");
}
});
rt.execute();
}
}
}
});
bmt.execute();
}
Edit:
Обратите внимание, что нет необходимости ставить в очередь метод JProgressBar#setString(...)
в потоке событий, поскольку весь приведенный выше код уже в потоке событий, EDT. Это необходимо только тогда, когда текущий код вызывается из EDT, или в некоторых других специфических ситуациях (это не одна из них).
Так что ваш код будет лучше выглядеть так:
// ** no need to queue this on the event thread.
// ** we're already IN the event thread!
recognitionProgress.setString("Marking ROI...");
bmt.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
if (pcEvt.getPropertyName().equals("state")) {
if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
// you'd probably have this in a method.
RecognitionTask rt = new RecognitionTask();
rt.addPropertyChangeListener(PrismRunnable.this);
// ** no need to queue this on the event thread.
// ** we're already IN the event thread!
recognitionProgress.setString("Segmenting...");
rt.execute();
}