IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Replacer les noeuds lors d'un drag and drop


Sujet :

Composants Java

  1. #1
    Membre actif Avatar de maloups
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Points : 208
    Points
    208
    Par défaut Replacer les noeuds lors d'un drag and drop
    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 ?

  2. #2
    Membre actif Avatar de maloups
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Points : 208
    Points
    208
    Par défaut
    Bon j'ai pas vraiment testé le résultat, mais j'ai du me pencher sur un problème vraiment très similaire : rafraichir le noeud d'un arbre

    Pour mon problème l'idée serait donc la suivante :
    Au moment du drag and drop, on connait le nom du noeud "parent", il suffit donc de reconstruire de la facon qui nous arrannge, puis de le rafraichir ...

    Une methode comme celle ci dessous devrait faire l'affaire :
    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
     
    	/**
             * Rafraichit le noeud complet
             * @param nodeParent le noeud à rafraichir
             */
    	private void refreshNoeud(DefaultMutableTreeNode nodeParent) {
     
    		//On supprime tous les éléments du noeud courant
    		nodeParent.removeAllChildren();
    		//On regénere le contenu du noeud
    		//Méthode qui ajoute les éléments dans le noeud les éléments dans l'odre souhaité
    		genererContenuNoeud(nodeParent);
    		//On recupere l'instance courante de l'arbre
    		JTree tree = monJTreeCourant;
    		//On indique au model de l'arbre que le noeud courant a été modifié !
    		((DefaultTreeModel) tree.getModel()).nodeStructureChanged(nodeParent);
     
    	}
    Voili voilou !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affichage d'une ligne lors d'un drag and drop
    Par jaljal dans le forum Flex
    Réponses: 13
    Dernier message: 09/03/2010, 11h41
  2. [JavaScript] Redimensionner les colonnes d'un tableau ( drag and drop )
    Par le_chomeur dans le forum Contribuez
    Réponses: 2
    Dernier message: 15/01/2010, 09h09
  3. [JList] afficher un menu lors d'un drag and drop
    Par skyangel dans le forum Composants
    Réponses: 4
    Dernier message: 12/03/2008, 15h16
  4. Réponses: 4
    Dernier message: 01/10/2005, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo