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 and Drop


Sujet :

AWT/Swing Java

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut Drag and Drop
    bonjour tout le monde,

    Je cherche à faire du DnD entre un Jtree et une JList. D'après ce que j'ai compris, ce mécanisme n'est pas implémenté par défaut dans la JList.Il faut redéfinir les classes Transferable et TransferHandler voir carrement fair un JList personnalisé en héritant de cet objet.

    Je n'ai pas très bien compris le fonctionnement avec les classes Tansferable et TransferHandler. Je pense (corrigé moi si je me trompe) que le Drag d'un noeud de l'arbre (DefaultMutaulTreeNode) revoit une string il faudrait donc transformer celle-ci en objet accepté par la JList, les fameux DataFlavor.

    Si par hasard quelqu'un a déjà fait ce type de DnD, merci de m'expliquer le mécanisme car la je bloque et ce projet doit être rapidement finit !!!

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Le DataFlavor est simplement un type particulier (il peut aussi avoir plusieurs type). Si tu veux glisser/coller un objet MonObjet alors le DataFlavor recensera le type MonObjet.

    Si tu veux seulement dragger un type String, je crois (à vérifier) que c'est déjà impélmenté de base dans pas mal d'objet Swing. Va voir une méthode qui doit ressembler à setDragEnabled(boolean b) et setDropMode(DropMode dropMode) .

    Le mécanisme de drag'n drop personnalisé Java est un peu galère au début. Voici un lien, j'espère qu'il t'aidera :
    http://webperso.iut.univ-paris8.fr/~...e/dragAndDrop/

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par spiky33 Voir le message
    Transferable et TransferHandler voir carrement fair un JList personnalisé en héritant de cet objet.
    Qui herite non pas vraiment, mais qui en a un oui.

    Je n'ai pas très bien compris le fonctionnement avec les classes Tansferable et TransferHandler.
    Transferable est une envelloppe qui package les differentes saveurs de l'objet (String, Image, <ce-que-tu-veux>... ordonnees dans le sens contenu riche -> contenu pauvre (generalement le plus pauvre est DataFlavor stringFlavor) et s'occupe des conversions depuis le type reel de l'objet depuis le type reel de l'objet vers la saveur (DataFlavor) demandee (ex : conversion d'une Color en sa representation de chaine hexadecimale).

    TransfertHandler est la classe qui s'occupe des mecanismes de couper/couper et coller.
    Ainsi tu peux faire un TransfertHandler #1 qui s'occupe de determiner quel noeud dans l'arbre source doit etre exporte et un TransfertHandler #2 qui s'occupe de determiner comment inserer cette donnee dans la liste destination. Une fois que c'est fait, dans le cas d'un couper, le TransfertHandler #1 retirera le noued en question de l'arbre. Il est commun de fusionner les deux TransfertHandler mais parfois ca rend la chose un peu moins comprehensible pour les debutants.

    Je pense (corrigé moi si je me trompe) que le Drag d'un noeud de l'arbre (DefaultMutaulTreeNode) revoit une string il faudrait donc transformer celle-ci en objet accepté par la JList, les fameux DataFlavor.
    Une String je ne sais pas, en fait tu peux transferer tout et n'importe quoi tu moment que tu utilises les bonnes saveurs. Mais c'est a toi d'indiquer dans le Transferable la liste des DataFlavor possibles et apres dans le TransfertHandler #2 de traiter celles acceptables a la reception et ensuite de faire les traitements appropries pour transformer la donnee...

    L'interret de ce mecanisme est qu'il permet egalement de faire du DnD avec l'OS sans modifier quoi que ce soit. Ainsi un Transferable qui prend en charge DataFlavor(java.io.File.class, "") ou une liste de fichier DataFlavor.javaFileListFlavor peut-elle interragir avec Explorer, etc..
    De meme en utilisant DataFlavor.imageFlavor, on peut par exemple exporter une image vers Word, etc...
    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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut
    Donc au final je dois juste regarder le drop mode de ma JList pour pouvoir y déposer mes nœuds? Car je suppose que le stringDataFlavor est implémenté dans la JList.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut
    Yes ok ça fonctionne....
    Merci à tous je pense avoir bien compris le mécanisme.

    Maintenant le second probléme est dû au multi drop (si je drop plusieur noeuds).
    Je ne sais pas comment ça marche.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Ben faut tester !

    Probablement que tu devras apposer un formattage special a la String (pour indiquer qu'il y a plusieurs noeuds) et faire un traitement approprie.
    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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    J'ai déjà implémenté un système équivalent (DnD entre JList et JTree et inversement). Voici le cheminement d'un DnD :

    Il faut d'abord posséder un objet de type "Transférable". Comme son nom l'indique il sert à transférer des données entre plusieurs éléments. L'exemple suivant représente le transfert de fichiers (entre un JTree et une JList par exemple, mais ca s'applique à tout !) :
    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
    public class MyTransferable implements Transferable {    
     
        private DataFlavor[] flavors = {new DataFlavor(), new DataFlavor()};  // flavor à personnaliser
     
        private List<File>   listFiles = new ArrayList<File>();
        private File[] files;
     
     
     
        public MyTransferable(File[] files) {
            setFiles(files);
        }
     
        public void setFiles(File[] files) {
            this.files = files;
     
            listFiles.clear();
            for(int i=0; i<files.length; i++)
                listFiles.add(files[i]);
        }
     
        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return flavors;
        }
     
        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            for (int i = 0; i < flavors.length; i++) {
    	    if (flavor instanceof EkDataFlavor) {
    	        return true;
    	    }
    	}
    	return false;
        }
     
        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            for(int i=0; i<flavors.length; i++) {
                if(flavor.equals(flavors[i]))
                    return listFiles;
            }
            throw new UnsupportedFlavorException(flavor);
        }
     
     
    }

    Ensuite il faut se servir de cette classe dans un TransferHandler :
    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
    public class MyTransferHandler extends javax.swing.TransferHandler {
     
     
        private MyTransferHandler() {
            super();
        }
     
     
     
     
     
        public int getSourceActions(JComponent comp) {
            // Ici tu indique comment tu veux déplacer un élément
            // copier = return COPY;
            // coller = return MOVE;
            // ne rien faire = return NONE;
        }
     
        @Override
        public Transferable createTransferable(JComponent comp) {
            // Ici tu créé ton objet "Transférable" qui contient les éléments à déplacer
        }
     
        @Override
        public boolean canImport(TransferSupport support) {        
            // Ici tu mets la condition pour laquelle on peut dropper un objet dans ta JList ou ton JTree
        }
     
        @Override
        public boolean importData(TransferSupport support) {
            // Ici tu mets tes méthodes d'insertion dans ta JList ou JTree
        }
     
     
        @Override
        public void exportDone(JComponent source, Transferable data, int action) {
            // Méthode exécutée une fois le transfert terminé (facultatif)
        }
     
    }
    Le cheminement est le suivant :
    1) vérification du type d'action à effectuer
    2) création du Transferable
    3) vérification que l'on peut dropper dans le composant de destination
    4) utilisation du Transferable dans le composant de destination
    5) faire une action facultative pour cloturer le cycle


    Suis-je clair ??

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. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48
  3. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  4. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  5. 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