Re Bonjour à tous !

Encore moi et mes JTree

Bon voilà, mon problème est le suivant :
J'ai mis en place le drag and drop sur mon JTree (jusque là tout va bien), par contre, il y a un petit truc qui ne me plait pas... lorsque je prends un noeud et que je le déplace dans un autre noeud, il se déplace automatiquement tous en bas de la liste des enfants du nouveau noeuds... (je sais pas si je suis tres clair, c'est pas evident à expliquer)

Mon code ressemble à ceci :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
 
import java.awt.Point;
import java.awt.dnd.DnDConstants;
 
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
 
/**
 * Gestion du Drag and Drop
 *
 */
public class DefaultTreeTransferHandler extends AbstractTreeTransferHandler {
 
	public DefaultTreeTransferHandler(TreeListePanier tree, int action) {
		super(tree, action, true);
	}
 
	/**
         * Determine si l'on peut déplacer le noeud
         * @param target l'emplacement ciblé
         * @param draggedNode le noeud que l'on souhaite deplacer
         * @param action l'action que l'on souhaite réaliser
         * @param location l'emplacement du noeud à déplacer
         * @return boolean indicant si l'on peut ou non déplacer le noeud
         * 
         */
	public boolean canPerformAction(TreeListePanier target, DefaultMutableTreeNode draggedNode, int action, Point location) {
		TreePath pathTarget = target.getPathForLocation(location.x, location.y);
		if (pathTarget == null) {
			target.setSelectionPath(null);
			return(false);
		}
		target.setSelectionPath(pathTarget);
		if(action == DnDConstants.ACTION_COPY) {
			return(true);
		} else if(action == DnDConstants.ACTION_MOVE) {	
			DefaultMutableTreeNode parentNode =(DefaultMutableTreeNode)pathTarget.getLastPathComponent();				
			// On ne peut pas déplacer un noeud si :
			// - Si c'est dans lui meme
			// - Si le parent du noeud courant ne change pas
			// - Si le nouveau noeud est un enfant du noeud courant
			// - Si le nouveau noeud n'est pas de type "Panier"
			if (parentNode == draggedNode.getParent() 
					|| draggedNode.isNodeDescendant(parentNode) 
					|| !(parentNode.getUserObject() instanceof Panier)) {					
				return(false);	
			}
			else {
				return(true);
			}				 
		}
		else {		
			return(false);	
		}
	}
 
	/**
         * Réalise le "drag and drop"
         */
	public boolean executeDrop(TreeListePanier target, DefaultMutableTreeNode draggedNode, DefaultMutableTreeNode newParentNode, int action) { 
 
		if (action == DnDConstants.ACTION_COPY) {
			DefaultMutableTreeNode newNode = target.makeDeepCopy(draggedNode);
			((DefaultTreeModel)target.getModel()).insertNodeInto(newNode,newParentNode,newParentNode.getChildCount());
			TreePath treePath = new TreePath(newNode.getPath());
			target.scrollPathToVisible(treePath);
			target.setSelectionPath(treePath);	
			return(true);
		}
		if (action == DnDConstants.ACTION_MOVE) {
			draggedNode.removeFromParent();
			((DefaultTreeModel)target.getModel()).insertNodeInto(draggedNode,newParentNode,newParentNode.getChildCount());
 
			TreePath treePath = new TreePath(draggedNode.getPath());
			target.scrollPathToVisible(treePath);
			target.setSelectionPath(treePath);
 
			saveDrop(draggedNode, newParentNode);
 
			return(true);
		}
		return(false);
	}
 
	/**
         * Sauvegarde le nouvelle emplacement de l'élément déplacé
         * @param draggedNode le noeud que l'on souhaite deplacer
         * @param newParentNode le nouveau parent du noeud courant
         */
	public void saveDrop(DefaultMutableTreeNode draggedNode, DefaultMutableTreeNode newParentNode) {
		Long panierId = ((Panier)newParentNode.getUserObject()).getId();
		try {
			Object monNoeud = draggedNode.getUserObject();
			// Affecte le nouvelle element "parent" + enregistrement de la modification
			if (monNoeud instanceof Panier){
				Panier monPanier = (Panier)monNoeud;
				monPanier.setIdParent(panierId);
				PanierService.modifier(monPanier, false, null);
			} else if (monNoeud instanceof EFolderPanier){
				EFolderPanier monPanier = (EFolderPanier)monNoeud;
				monPanier.setIdPanier(panierId);
				EFolderPanierService.modifier(monPanier, false, null);
			}
 
		} catch (Exception e) {
			log.error(e);
		}
	}
 
}
L'idée (la plus simple qui me viens à l'esprit, serait de détruire tous les éléments attachés au nouveau noeud, puis de reconstruire ce nouveau noeud à ma sauce (je dispose d'une méthode "recupereMoiTousLesEnfantsDuNoeud(Long idNoeud)" )
J'ai bien essayé quelque truc, mais rien n'y fait...

Des suggestions ?