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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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 averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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 averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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 averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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 averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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 averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    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...

+ 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