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

AWT/Swing Java Discussion :

Drag n Drop -> TransferHandler


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut Drag n Drop -> TransferHandler
    Bonjour à tous,

    J'ai un soucis avec la class TransferHandler que je n'arrive pas à resoudre.
    J'implemente une action de dnd, à l'aide de TransferHandler et de Transferable.

    Le soucis c'est que la méthode "createTransferable" de TransferHandler n'est jamais appelée et je ne comprends pas pourquoi !?
    Du coup, je ne peux js créer mon objet à transferer (Transferable), et je suis donc bloqué !

    Est-ce que tu es deja tombé sur ce genre de pb ?
    En parcourant le web, je me suis rendu compte que ce fameux TransferHandler et notamment CreateTransferable souffrait de bugs !! vos avis !?

    merci

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Il y a vraiment un truc qui m'echappe ! voila un example tres simple ... qui ne marche pas ! attention, je n'ai pas traiterle drop. mais on peut deja voir que si je commente le "setTransferHandler" le curseur se met bien en position "move", alors que sinon, il semble bloqué ...

    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
     
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.util.Vector;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTree;
    import javax.swing.TransferHandler;
    import javax.swing.tree.DefaultMutableTreeNode;
     
    public class Test extends JFrame{
    	 public Test (){
    	    	JPanel mainPan = new JPanel();
    	    	mainPan.setLayout(new BorderLayout());    	
    	    	DefaultMutableTreeNode racine = new DefaultMutableTreeNode("Root") ;	
    	    	for( int i = 0; i < 3; ++i)
       		        racine.add( new DefaultMutableTreeNode("fils N° "+ i));
     
    	    	JTree jt = new JTree(racine);
    	    	jt.setTransferHandler(new TransferHandler("bipbip"));  	
    			jt.setDragEnabled(true);	
    	    	mainPan.add(jt);   	
    	    	getContentPane().add(mainPan);
    	    }
     
    	    public static void main(String [] args){
     
    	          	/*launch window*/
    	            Runnable runnable = new Runnable() {
    	            	public void run() {
    	            		Test appli = new Test(); 
    	            		WindowListener l = new WindowAdapter(){
    	            			public void windowClosing(WindowEvent e){
    	            				System.exit(0);
    	            			}
    	            		};
    	            		appli.addWindowListener(l);	    
    	                    appli.setSize(250,500);
    	                    appli.setVisible(true);
    	                }
    	            };            
    	           	EventQueue.invokeLater(runnable);
    	        } 
    	    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Il faut que tu definisse une classe a toi transfertHandler je pense.

    J'ai fait une appli ou on peut drag n drop un fichier depuis l explorer sur une jlist, j ai recuperer le code quelque part si tu veut je peut te l envoyer.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 53
    Par défaut
    Salut,
    Il faut que tu regarde du coté de DragGestureListener, DragSourceListener, DropTargetListener pour créé ton TransferHandler.

    J'ai créé un topic sur ce forum pour savoir comment entre autre utiliser la classe TransferHandler de java 6, car je préfererai utiliser moi aussi cette classe.

    Drag n Drop jTree

    Si ça t'aide.

    A+

  5. #5
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par CristalWing
    Salut,
    Il faut que tu regarde du coté de DragGestureListener, DragSourceListener, DropTargetListener[...]
    plus besoin de tout ça en JAVA 6...


    Par contre, ce nouveau cours est très intéressant et explique le drag n drop sous JAVA6

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    En tout cas dans les tutoriels de sun, ils appellent setDragEnabled pour lancer le tout

    [EDIT] j'avais mal lu ton code .
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 53
    Par défaut
    mais on peut deja voir que si je commente le "setTransferHandler" le curseur se met bien en position "move", alors que sinon, il semble bloqué ...
    ça fait la meme chose chez moi.

    plus besoin de tout ça en JAVA 6...

    oui mais comment avec un jtree? (j'ai testé avec des string ça marche)


    En tout cas dans les tutoriels de sun, ils appellent setDragEnabled pour lancer le tout
    Comment gérer le drop lui ne ce gère pas tout seul ?

  8. #8
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Je ne comprends pas tes questions... Voici comment je fais fonctionner le drag n drop sur mon jtree en java 6 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            monJTree.setTransferHandler(new MyTransfertHandler());
            monJTree.setDropMode(DropMode.ON_OR_INSERT);
            monJTree.setDragEnabled(true);
    Ces 3 lignes suffisent... Le reste est géré dans ma classe MyTransfertHandler (avec les dataflavor, les transferable, ...)

    Lis le cours cité plus haut si tu veux mieux comprendre

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 53
    Par défaut
    C'est mon TransferHandler qui doit pas etre bon.
    J'ai un canImport et importData dedans c'est tout il doit falloir implementer un peut plus.

    Je vais reprendre a zero et relire le cours merci Claythest

  10. #10
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    Alors j'ai trouvé d'ou vient le probleme ... C'est en effet dans le transferHandler, qui hérite de TransferHandler.
    ll faut redéfinir :
    createTransferable(JComponent c)
    getSourceActions(JComponent c)
    etc ...

    J'avais oublié l'argument de getSourceActions, donc il ne faisait rien.
    C'est le soucis des héritage, je ne comprends pas pourquoi tout ca n'a pas été implémenté sous forme d'interface ... ca évite les erreurs betes comme ca !

    Du coup je passe par DragGestureListener, DragSourceListener, DropTargetListener, qui permettent notamment de pouvoir definir de facon plus simple quelle action faire sur quel composant (de ton arbre), etc ...
    Mais j'ai un soucis. je déclare un DragSourceListener sur mon arbre, et quand il y un drag je crée un élément Transferable.
    J'ai un JButton qui est cencé recevoir tout ca, donc je lui ai donné un DropTargetListener, mais lorsque je regarde ce que la fonction drop() récupére, il ne s'agit pas de mon élément Transferable !
    En fait, j'ai l'impression que cet élément ne passe à mon autre container, et je ne comprends pas pourquoi ???

    Any ideas ?
    merci

  11. #11
    Membre averti
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Par défaut
    En fait c'est pire que ca ... mon élément Transferable ne passe pas du DragSourceListener au DropTarget ...
    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
     
    public class DndListener implements DragGestureListener, DragSourceListener, DropTargetListener{
     
    	DragSource source;
    	DropTarget target;
    	DragGestureRecognizer recognizer;
     
    	JTree arbre;
     
    	public DndListener (JTree a, JButton trash){
    		arbre=a;
        	source = new DragSource();
        	//target = new DropTarget(trash, this);
        	target = new DropTarget(arbre, this);
            recognizer = source.createDefaultDragGestureRecognizer(arbre,DnDConstants.ACTION_MOVE, this);
    	}
     
     
    	/*First function called for each drag*/
    	public void dragGestureRecognized(DragGestureEvent dge) {
    		TreePath path = arbre.getSelectionPath();
    		TreeElement te = (TreeElement)path.getLastPathComponent();
    		if (te instanceof Folder){
    			//No drag on folder
    			return;
    		}
    		else if ((path == null) || (path.getPathCount() <= 1)) {
    	      // We can't move the root node or an empty selection
    	      return;
    	    }
    		else{
    			try{
    				Transferable totrans = new TransferablePath(path);
    				System.out.println(path+" -> "+totrans);
    				//dge.startDrag(DragSource.DefaultMoveDrop, totrans , this);
    				source.startDrag(dge, DragSource.DefaultMoveDrop, totrans, this);
     
    				//arbre.setCursor(DragSource.DefaultMoveDrop);
    			}
    			catch(InvalidDnDOperationException idoe) {
    			    System.err.println(idoe);				
    			}
    		}
    	}
     
    	/*Drag source -> JTree*/
    	public void dragDropEnd(DragSourceDropEvent dsde) {
    		/*
    		//arbre.setCursor(Cursor.getDefaultCursor());
    		Transferable t = dsde.getDragSourceContext().getTransferable();
    		System.out.println("Drag Drop End ->"+t);
    		try{
    		System.out.println(t.getTransferData(TransferablePath.TREE_PATH_FLAVOR));
    		}
    		catch(Exception e){			
    		}
    		*/
    	}
    	public void dragEnter(DragSourceDragEvent dsde) {}
    	public void dragExit(DragSourceEvent dse) {}
    	public void dragOver(DragSourceDragEvent dsde) {}
    	public void dropActionChanged(DragSourceDragEvent dsde) {}
     
    	/*Drop target -> TRASH*/
    	public void dragEnter(DropTargetDragEvent dtde) {
    		System.out.println("drop enter ");
    	}
    	public void dragExit(DropTargetEvent dte) {
    		System.out.println("drop exit ");
    	}
    	public void dragOver(DropTargetDragEvent dtde) {
    		System.out.println("dragOver");
    	}
    	public void drop(DropTargetDropEvent dtde) {
    		Transferable t = dtde.getTransferable();
    		System.out.println("drop target event ->"+t);
    		try{
    		System.out.println(t.getTransferData(TransferablePath.TREE_PATH_FLAVOR));
    		}
    		catch(Exception e){
     
    		}
    	}
    	public void dropActionChanged(DropTargetDragEvent dtde) {
    		System.out.println("drop action changed exit");
    	}
     
    }
    Je suis prenneur de toutes remarques ;-)
    merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Et c'est logique.

    En MP je t'avais fourni certains codes pour te montrer comment utiliser TransferHandler.

    Comme le disait si bien Claythest, les DragGestureListener et autres, ne sont plus utiles. Tu peux te limiter à créer toi meme ton TransferHandler.

    Dans les codes que je t'ai envoyé, j' utilise effectivement DropTargetListener, uniquement pour rejeter le DROP sur cet objet et donc modifier le curseur a cet endroit pour le DROP (sens interdit). Et c'est tout ce a quoi me sert cela.

    Je pense donc que tu utilises mal la chose. TransferHandler et les Drag/Drop GestureListener, dans ton cas, se rentrent dedans l'un dans l'autre.

    Logique donc qu'il ne passe pas dans tes methodes de drag/drop.

  13. #13
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par snico
    [...]C'est le soucis des héritage, je ne comprends pas pourquoi tout ca n'a pas été implémenté sous forme d'interface ... ca évite les erreurs betes comme ca ![...]
    J'avoue que je ne comprends pas pourquoi ils n'ont pas fait une interface TransfertHandler et une classe DefaultTransfertHandler... J'aurai trouvé ça aussi plus simple... Ou alors il y a un détail qui m'échappe...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Bah en fait c'est a toi de le faire.

    Pour ce que je fais par exemple, je fais un drag and drop d'un Materiel , depuis un Arbre, vers un Panneau.

    Je spécifie donc un MaterielTransferHandler, abstrait, qui spécifie toutes les methodes a implementer (createTransferable, export, import, ...)

    Et ensuite ArbreTransferHandler extends MaterielTransferHandler, puis idem avec PanneauTransferHandler

    Tres facile une fois assimilé

  15. #15
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Sauf que si tu veux redéfinir un fonctionnement il est plus simple d'implémenter une interface, qui te liste automatiquement toutes les méthodes que tu dois redéfinir, plutôt que de définir une sous classe et chercher quelles sont les méthodes à redéfinir...

    C'est sûr que une fois assimilé, ça reviens au même, mais je pense qu'avec une interface cela facilite cette assimilation

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Pas faux

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  3. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  4. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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