Bonjour à tous,

Dans une interface graphique Swing, afin de gérer facilement une barre de chargement j'utilise un SwingWorker. Ma question porte sur la méthode SwingWorker.done() mais je vais d'abord présenter mon problème.

Quand on l'exécute, le SwingWorker lance la méthode doInBackground(). A la fin de cette méthode, je signale à l'interface graphique de faire des actions spécifiques par la méthode mettreAJourIHM() (notamment cacher la barre de chargement) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MaTache extends SwingWorker<Void, Void>{
 
   ...
 
   public void doInBackground(){
 
      for(int i = 0 ; i < 100 ; i++){
 
         // Faire des trucs
         ...
 
      }
 
      mettreAJourIHM();
 
      return null;
 
   }
 
}
J'ai voulu ajouter la possibilité d'interrompre l'exécution. J'ai donc modifier la boucle for par une boucle while de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MaTache extends SwingWorker<Void, Void>{
 
   ...
 
   public void doInBackground(){
 
      int i = 0;
 
      while(i < 100 && !Thread.currentThread().isInterrupted()){
 
         // Faire des trucs
         ...
 
         i++;
 
      }
 
      mettreAJourIHM();
 
      return null;
 
   }
 
}
Le problème de ce bout de code est que si le SwingWorker est interrompu, la méthode mettreAJourIHM() ne sera pas appelée. Pour pallier cela, je pensais redéfinir la méthode SwingWorker.done() et appeler mettreAJourIHM() dedans.

Cependant, la dernière phrase de cette page me laisse un peu perplexe quant à la conduite à tenir. Il est en effet dit :
SwingWorker ne garantit pas que la méthode done sera appelée après tous les appels à process. Ainsi, si vous mettez dans la méthode done l'affichage d'une ligne supplémentaire dans le textarea, cette ligne ne se trouvera pas forcément en dernière dans le textarea.
Comment cela se fait-il ? A lire la javadoc j'avais pourtant l'impression que done() était appelé à chaque fois que l'exécution avait lieu (qu'elle soit interrompue ou non).

Comment puis-je faire pour que ma fonction de mise à jour de ma GUI soit toujours exécutée ?