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 :

[Jtree] Problème cut / copy / paste


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut [Jtree] Problème cut / copy / paste
    Bonjour à tous,
    voilà mon problème existentiel:
    J'ai crée un JTree avec possibilité de Drag'n'Drop (version 1.6) avec un TransferHandler à ma sauce, ce qui fonctionne bien.
    Maintenant, j'aimerais pouvoir copier/coller des noeuds ainsi que couper/coller. J'ai vu sur le tuto de sun que les JTree avaient de base la possibilité du "copier" (avec le raccourci ctrl-c) et que, pour implémenter le reste des fonctionnalités, il suffisait de :

    Create a manner by which the TransferHandler's cut/copy/paste support can be invoked. Typically, this involves adding bindings to the input and action maps to have the TransferHandler's cut/copy/paste actions invoked in response to particular keystrokes.
    Or voilà. En modifiant simplement la méthode importData() du TransferHandler, j'obtiens un couper coller! et ce quels que soient les racourcis claviers que j'implémente et les méthodes appelées par ces raccourcis ( getCopyAction() par exemple affectée à ctrl-p, après un ctrl-p puis ctrl-v, voilà que mon noeud est coupé/collé! ).

    Quelqu'un aurait-il une idée pour un obtenir un véritable copier/coller? et pas systématiquement un couper/coller.

    Ayez pitié de mon ordi qui va finir par la fenêtre sinon

    P.S: je suis tout nouveau, faut-il que je poste un bout de code?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Je précise les racourcis claviers que je rajoute dans le constructeur de mon arbre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    InputMap imap = new InputMap();
    		//ajout des raccourcis claviers aux actions voulues
    		imap.put(KeyStroke.getKeyStroke("ctrl C"), "copier");
    		imap.put(KeyStroke.getKeyStroke("ctrl X"), "couper");
    		imap.put(KeyStroke.getKeyStroke("ctrl V"), "coller");
     
    		//ajout des raccourcis au composant
    		ActionMap map = this.getActionMap();
    		map.clear();
    		map.put("copier", TreeTransferHandler.getCopyAction());
    		map.put("couper", TreeTransferHandler.getCutAction());
    		map.put("coller", TreeTransferHandler.getPasteAction());
    Or, lorsque je fais un ctrl C et un coller, j'obtiens un couper-coller
    Du coup je ne comprend plus rien, y aurait-il un problème au niveau de mon TreeTransferHandler?
    Merci d'avance pour vos suggestions.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Je reviens sur mon problème:
    si je commente le code pour l'ajout des raccourcis claviers dans le constructeur de mon arbre, ces raccourcis fonctionnent quand même!!!
    Avec le même comportement de couper/coller...
    Du coup, je suppose que cela vient de mon transferHandler, dont voici le code pour la partie paste:
    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
     
    else {	//on a affaire à un paste
    		TreePath pasteInsertPath =((TaskTreeII)cp).getSelectionPath();
     
    		//dernier noeud, cad celui sélectionné
    		TaskNode selectedNode = (TaskNode)pasteInsertPath.getLastPathComponent();
    		//d'abord vérifier que l'on ne colle pas "dans" un fils (selectedNode) du noeud (newTnode)
    		if (selectedNode.isNodeAncestor(newTnode)){
    			JOptionPane.showMessageDialog(null, "On ne peut couper/coller un ancêtre dans un de ses fils", "erreur de collage",
    								JOptionPane.ERROR_MESSAGE);	
    		}
    		else {
    			if (selectedNode.isLeaf()){ //si c'est une feuille, on insère juste derrière
     
    				//	nombre de noeuds dans le path
    				int j = pasteInsertPath.getPathCount();
    				//noeud branche dont l'un des fils est le noeud selectionné (j-1)
    				TaskNode branchNode = (TaskNode)pasteInsertPath.getPathComponent(j - 2);
    				//index du noeud selectionné
    				int insertIndex = branchNode.getIndex(selectedNode);
    				dftm.insertNodeInto(newTnode, branchNode, insertIndex + 1);
    			}
    			else{	//c'est une branche, on insère à la fin de ses fils
     
    				if (selectedNode.isNodeChild(newTnode)){
    					//le noeud du drop est le parent alors insérer en fin de ses enfants (en comptant le noeud coupé en moins)
    					dftm.insertNodeInto(newTnode, selectedNode, selectedNode.getChildCount() - 1);
    				}
    				else{
    					dftm.insertNodeInto(newTnode, selectedNode, selectedNode.getChildCount());
    				}
    			}
    		}
    	}
    J'espère que cela pourra aider...(à m'aider )

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Une bonne âme pour me dire que mon problème est insoluble?
    A moins de ne pas avoir été assez clair pour exposer mon problème?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    A nouveau moi,
    j'apporte qq précisions:
    quand je coupe-colle, mon noeud est bien coupé au moment du coupé, puis collé au moment du collé.
    Par contre, lorsque je copie-colle, mon noeud est coupé-collé au moment du collé (le noeud est donc toujours visible après le copier).
    J'ai donc cherché à rajouter "à la main" le noeud après l'opération copier-coller en gardant une référence sur celui-ci et en rajoutant dans la méthode importData() de mon TransferHandler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //enfin si l'action est de type COPY, il faut laisser le noeud source en place
    if (type == COPY){
    	dftm = (DefaultTreeModel)tree.getModel();
            dftm.insertNodeInto(noeudSource, parent, indexSource);
    }
    Lorsque je fais un copier-coller après cet ajout, il ne se passe "rien" ( c'est déjà ça de plus avoir de couper-coller!) Apparemment, le fait d'ajouter deux noeuds à mon jtree au sein de la même méthode ne serait pas possible? A moins que mon "rien" ne soit le produit du hasard: il y aurait ajout d'un seul noeud qui serait le même que celui de départ à la même place?(d'où le rien)
    Oulà, je sais pas si ça veut dire qq chose ce que je viens de raconter!
    Bref, vous l'aurez compris, il me fait bien galérer ce jtree!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Bon! je crois que j'ai trouvé, donc si ça peut aider des blaireaux dans mon genre à pas chercher de midi à 14h, voilà la solution:

    dans la méthode createTransferable() du TransferHandler, je retournais directement le noeud sélectionné dans l'arbre, et non pas un clone de ce noeud. Du coup ca me faisait des choses bizarres du genre ci-dessus, à cause des liens que le noeud garde avec son parent ou ses descendants...
    Même si je suis pas sûr de tout comprendre... (c'est le moins qu'on puisse dire), voilà une bonne chose de faite!

    Maintenant, reste plus qu'à s'attaquer au nouveau problème soulevé par cette méthode: comment copier les branches avec leurs feuilles et non pas seules??
    Ca sera pour un autre post...

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ah il semble que tu ais pu rapidement trouver reponses a tes question. Je te dirai que je me suis egalement casse la tete pour ce genre de choses il y a quelques annees et que c'est manuellement que j'ai decide si on faisait un copier/coller ou couper/coller dans l'arbre lors de la creation du TransfertHandler :
    - la premiere solution passant egalement par un clone()
    - dans la seconde solution, lors du coller je detachais le noeud de l'arbre* pour effectivement eviter toutes sortes de problemes... Mon TransfertHandler gardait une reference sur l'arbre source/noeud parent tant que le coller n'avait pas lieu de maniere a faciliter les operations de mise a jour de l'arbre.

    *c'etait un gestionnaire de calques pour une pile de rendu et je ne pouvais deplacer que les calques qui etaient des feuilles dans l'arbre.

    Pour une banche... je pense qu'il va te falloir probablement cloner en profondeur la branche. C'est a dire parcourir la branche source et cloner chacun des noeuds puis les ajouter dans la branche destination.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Oh lala! même pas droit de faire un post supplémentaire, bouye me file déjà la solution!
    Merci d'avance du coup

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

Discussions similaires

  1. Problème copy/paste filtre
    Par julie.t dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/06/2014, 09h40
  2. [Débutant] explorateur fichier (listview) et cut/copy et paste
    Par waspy59 dans le forum C#
    Réponses: 7
    Dernier message: 01/06/2012, 16h56
  3. Slot cut(), copy(), paste()?
    Par maroua_mm dans le forum Qt
    Réponses: 1
    Dernier message: 05/09/2009, 22h31
  4. Slots cut copy paste print
    Par maroua_mm dans le forum Qt
    Réponses: 5
    Dernier message: 17/04/2009, 10h28
  5. Copy, Cut et Paste dans un JTextPane
    Par elendrim dans le forum Composants
    Réponses: 2
    Dernier message: 23/06/2008, 09h37

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