J'ai une question sur les SwingWorker, j'utilise un JTree qui présente une arborescence de dossiers et lorsque l'utilisateur sélectionne un dossier je lance un SwingWorker qui affiche dans un JPanel positionné à coté les images du répertoire.
Mon SwingWorker fait un publish toutes les 10 images pour afficher le contenu du répertoire avant de l'avoir analysé en entier.

Mon problème se pose lorsque l'utilisateur sélectionne un autre dossier dans l'arborescence avant que le précédent SwingWorker soit terminé.
Les deux mettent ajoutent les images dans le JPanel et ça devient le bazard.

J'ai essayé d'arreter mon SwingWorker en faisant un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
	if (lp != null) {
		while (lp.isDone() == false) {
			lp.cancel(true);
		}
	}
Sachant que lp est mon SwingWorker et est déclaré dans la classe comme ceci : private ListLocalThumbnailsSW lp;
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
25
26
27
28
29
30
 
    @Override
    protected Object doInBackground() throws Exception {
        logger.log(Level.INFO, "+ ListLocalThumbnailsSW");
        tl.clearAll();
        FolderNode folderNode = (FolderNode) e.getPath().getLastPathComponent();
        logger.log(Level.INFO, "Recherche des images dans le repertoire : {0}", folderNode.getPathFolder());
        File currentFolder = new File(folderNode.getPathFolder());
        File[] listImage = currentFolder.listFiles(new ImageFilter());
        logger.log(Level.INFO, "Le repertoire : {0} contient {1} image(s)", new Object[]{folderNode.getPathFolder(), listImage.length});
        List<LocalPhoto> tmpLst = new ArrayList<LocalPhoto>();
        for (int i = 0; i < listImage.length; i++) {
            if(Thread.interrupted()) {
                logger.log(Level.INFO, "Arret du thread");
                return null;
            }
            LocalPhoto localPhoto = new LocalPhoto(listImage[i]);
            tmpLst.add(localPhoto);
            if (tmpLst.size() == PACKET_SIZE) {
                logger.log(Level.FINE, "Publication de {0} images", new ArrayList<LocalPhoto>(tmpLst).size());
                publish(new ArrayList<LocalPhoto>(tmpLst));
                tmpLst.clear();
            }
        }
        logger.log(Level.FINE, "Publication de {0} images", new ArrayList<LocalPhoto>(tmpLst).size());
        if(Thread.interrupted()) return null;
        publish(new ArrayList<LocalPhoto>(tmpLst));
 
        return null;
    }
Je vois d'ou le problème peut venir, dans ma méthode publish j'appelle une méthode ( replaceAll(List<LocalPhoto> localPhotoList) )de mon Jpanel qui ajoute les images
Si je demande l'interruption de mon SwingWorker il s'arrete mais cette méthode tourne encore pendant que cette méthode tourne mon nouveau SwingWorker démarre et à la deuxième ligne dans le doInBackground() je fais un tl.clearAll() qui efface le contenu de mon JPanel, si jamais ma méthode replaceAll(List<LocalPhoto> localPhotoList) n'a pas fini de s'executer elle continu d'ajouter des images.

J'imagine qu'il y a un problème de synchronisation dans mes thread mais je ne vois pas comment le régler.