Vous devez comprendre qu'il n'y a pas de pause dans le code (ne devrait y avoir) entre votre appel à
recognitionProgress.setString("Marking ROI...");
et
recognitionProgress.setString("Segmenting...");
sauf pour les millisecondes requises pour le premier bit du code pour compléter et atteindre le second bit de code, et les deux tâches d'arrière-plan se produisent probablement simultanément.
options pour résoudre ce comprennent:
- En utilisant deux JProgressBars, une pour chaque tâche,
- ou l'exécution des deux tâches à partir d'un seul SwingWorker de sorte que les deux peuvent se faire dans le même thread d'arrière-plan et l'exécution séquentiellement,
- ou l'exécution de la deuxième tâche après que l'écouteur de modification de propriété de la première tâche vous informe que la première tâche a été achevée (la propriété d'état renvoie SwingWorker.StateValue.DONE).
par exemple,
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:
Notez qu'il n'y a pas besoin de faire la queue la méthode JProgressBar#setString(...)
sur le fil des événements, puisque tout le code ci-dessus est déjà dans le fil des événements , l'EDT. Ceci n'est nécessaire que lorsque le code actuel est annulé de l'EDT, ou dans quelques autres situations particulières (ce n'est pas l'un d'entre eux).
Donc, votre code serait mieux ressembler à ceci:
// ** 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();
}