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 - Comprend pas - Dernier recours


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut Drag and Drop - Comprend pas - Dernier recours
    Salut à tous,

    J'ai déja posté ici et ailleurs concernant des problemes a certains niveaux dans mon application.

    Là j'ai découvert une cool lib. qui gere les graphes etc ...
    Le probleme c est qu'il reste encore du boulot niveau graphique (dont je suis pas un chef) , et le projet n'avance toujours pas hors graphique ... et je pige trop plus ...

    En gros:

    Sur la gauche, un JTree mit dans un JScrollPane. Ce JTree est composé d'objets de type: 'Materiel' implements transferable

    Sur la droite, j'utilise donc ma librairie 'JUNG' qui s'occupe de la représentation des graphes dans un JApplet

    Le but étant: drag depuis le JTree dans le JApplet et hop création du noeud, bla bla.

    Problème:

    - Je drag-drop , ca marche (le JApplet se met pas a jour de suite et la position est mauvaise, mais ca c est un détail).

    Vous allez me dire: mais pourquoi il fait un post alors si le DnD fonctionne

    - Lors du premier drag and drop : on drag le curseur change mais reste le meme partout (sur tout l'écran), je drop sur le JApplet a droite et quand je le met a jour le drop c est bien passé.
    - Ensuite je veux en drag un second: là le curseur change (le curseur passe en : sens interdit quand il ne peut pas droper), mais le curseur ne change pas correctement, a savoir que si je me fie au curseur, je peux dropper dans toute mon appli (meme le JTree) sauf a l'intersection JTree-JApplet ... alors que bon ca devrait etre droppable que dans le JApplet.
    - Pour finir donc, au second drag-drop , lorsque je drag un objet de mon jtree , exception :

    Exception in thread "AWT-EventQueue-0" java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress

    Je me permet donc de vous paster mon code, et espere vraiment que quelqu un saura me sortir de cette galere car là je perd mon temps a mort sur le graphique et le projet de stage n'avance pas ...

    Grand merci d'avance .

    Voici donc le code :

    La fenetre principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Principal extends JFrame {
        private Tableau tableau;
        private Liste liste;
     
        /** Creates a new instance of Principal */
        public Principal() {
            liste = new Liste();
            getContentPane().add(liste, BorderLayout.WEST);
            getContentPane().add(Tableau.getInstance());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    Le code de la Liste

    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
     
    public class Liste extends JApplet {
        private Arbre tree;
     
        /** Creates a new instance of Liste */
        public Liste() {
             DefaultMutableTreeNode top = new DefaultMutableTreeNode("Material");
             createNodes(top);
             tree = new Arbre(top);
             JScrollPane treeview = new JScrollPane(tree);
             add(treeview);
        }
     
        private void createNodes(DefaultMutableTreeNode top) {
            DefaultMutableTreeNode materiel = null;
            materiel = new DefaultMutableTreeNode(new Cmx());
            top.add(materiel);
        }
    }
    Et celui du JTree
    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
     
    public class Arbre extends JTree implements DragGestureListener,
                                                  DragSourceListener, DropTargetListener {
        private DragSource dragSource;
     
        /** Creates a new instance of Arbre */
        public Arbre(DefaultMutableTreeNode top) {
            super (top);
            getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            setDragEnabled(true);
            dragSource = DragSource.getDefaultDragSource();
            dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this);
            DropTarget dropTarget1 = new DropTarget(this, Tableau.getInstance().getVisualization());
            this.setDropTarget(dropTarget1);
        }
     
        public void dragGestureRecognized(DragGestureEvent e) {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)getLastSelectedPathComponent();
            if (node == null) return;
            Object nodeInfo = node.getUserObject();
            Materiel drag = null;
            if (node.isLeaf()) {
                drag = (Materiel)nodeInfo;
            }
            else
                return;
     
            Cursor cursor;
            switch (e.getDragAction()) {
                case DnDConstants.ACTION_MOVE:
                    cursor = DragSource.DefaultMoveDrop;
                    break;
                default:
                    return;
            }
            e.startDrag(cursor, drag, this);
        }
     
        public void dragDropEnd(DragSourceDropEvent e) {
        }
     
        public void dragExit(DragSourceEvent e) {
        }
     
        public void dropActionChanged(DragSourceDragEvent e) {
        }
     
        public void dragOver(DragSourceDragEvent e) {
        }
     
        public void dragEnter(DragSourceDragEvent e) {
     
        }
     
        public void drop(DropTargetDropEvent e) {
            e.rejectDrop();
        }
     
        public void dragExit(DropTargetEvent e) {
        }
     
        public void dropActionChanged(DropTargetDragEvent e) {
     
        }
     
        public void dragOver(DropTargetDragEvent e) {
     
        }
     
        public void dragEnter(DropTargetDragEvent e) {
            if (e.isDataFlavorSupported(Materiel.materielDataFlavor))
                e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); 
        }
     
    }
    Le JTree est donc composé de Materiel :

    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
     
    public class Materiel extends SparseVertex implements Transferable {
        String image;
        public static DataFlavor materielDataFlavor = new DataFlavor(Materiel.class, "Materiel");
        public static DataFlavor[] supportedFlavors = { materielDataFlavor };
     
        /** Creates a new instance of Dessin */
        public Materiel(String image) {
            this.image = image;
        }
     
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
            if (flavor.equals(materielDataFlavor)) {
                return this;
            } 
            else
                throw new UnsupportedFlavorException(flavor);
        }
     
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return (flavor.equals(materielDataFlavor));
        }
     
        public DataFlavor[] getTransferDataFlavors() {
            return (DataFlavor[]) supportedFlavors.clone();
     
        }
    }
    Et un Materiel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Cmx extends Materiel {
     
        /** Creates a new instance of Rita */
        public Cmx() {
            super ("images/rita.gif");
        }
     
        public String toString() { return "CMX";}
    }
    Voici donc pour le coté gauche de l'application, un JTree dans un JScrollPane, tout cela mit dans un JApplet sur la gauche de la JFrame. Le JTree composé de Materiel (implementant Transferable et aussi SparseVertex utilisé par la lib. JUNG, donc ne nous importe pas dans ce cas ci). Le but est donc de pouvoir DRAG depuis le JTree un Materiel, et de le dropper dans le Tableau (voir ci apres). Et uniquement dans le Tableau (pas de drop dans le JTree, etc).

    Pour la partie de droite, le tableau dans lequel les objets pourront etre DROPPER (et uniquement dropper, pas de drag dans Tableau), ce code normalement n'interessera personne, mais c est pour bien montrer 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
    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
     
    public class Tableau extends JApplet {
        private static Tableau tableau = null;
     
        private Graph graph;
        private AbstractLayout layout;
        /**
         * the visual component and renderer for the graph
         */
        private MyVisualization vv;
        private DefaultSettableVertexLocationFunction vertexLocations;
     
        private GraphZoomScrollPane panel;
     
        /**
         * create an instance of a simple graph with popup controls to
         * create a graph.
         * 
         */
        private Tableau() {
            // allows the precise setting of initial vertex locations
            vertexLocations = new DefaultSettableVertexLocationFunction();
            // create a simple graph for the demo
            graph = new SparseGraph();
            PluggableRenderer pr = new PluggableRenderer();
            this.layout = new StaticLayout(getGraph());
            layout.initialize(new Dimension(600,600), vertexLocations);
            vv =  new MyVisualization(layout, pr);
            pr.setEdgeShapeFunction(new EdgeShape.QuadCurve());
            pr.setVertexStringer(new VertexStringer() {
                public String getLabel(ArchetypeVertex v) {
                    return v.toString();
                }});
            Container content = getContentPane();
            panel = new GraphZoomScrollPane(vv);
            content.add(panel);
            final EditingModalGraphMouse graphMouse = new EditingModalGraphMouse();
     
            // the EditingGraphMouse will pass mouse event coordinates to the
            // vertexLocations function to set the locations of the vertices as
            // they are created
            graphMouse.setVertexLocations(vertexLocations);
            vv.setGraphMouse(graphMouse);
            graphMouse.add(new EditingPopupGraphMousePlugin(vertexLocations));
            graphMouse.setMode(ModalGraphMouse.Mode.EDITING);
     
            final ScalingControl scaler = new CrossoverScalingControl();
            JButton plus = new JButton("+");
            plus.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    scaler.scale(vv, 1.1f, vv.getCenter());
                }
            });
            JButton minus = new JButton("-");
            minus.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    scaler.scale(vv, 1/1.1f, vv.getCenter());
                }
            });
     
            JPanel controls = new JPanel();
            controls.add(plus);
            controls.add(minus);
            JComboBox modeBox = graphMouse.getModeComboBox();
            controls.add(modeBox);
            content.add(controls, BorderLayout.SOUTH);
        }
     
        public void maj() {
            vv.repaint();
        }
     
        public static Tableau getInstance() {
            if (tableau == null)
                tableau = new Tableau();
            return tableau;
        }
    Ensuite donc le Panel où l'on peut dropper les Materiel (Objet VisualizationViewer, spécifique a la lib JUNG):

    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
     
    public class MyVisualization extends VisualizationViewer implements DragGestureListener, 
                                                             DragSourceListener, DropTargetListener {
        private Materiel droppedMateriel = null;
        private Point droppedPoint = null;
     
     
        /** Creates a new instance of MyVisualization */
        public MyVisualization(AbstractLayout layout, PluggableRenderer pr) {
            super (layout, pr);
            setBackground(Color.white);
            setPickSupport(new ShapePickSupport());
            setToolTipFunction(new DefaultToolTipFunction());
            DropTarget dropTarget = new DropTarget(this, this);
            this.setDropTarget(dropTarget);
        }
     
        public void dragGestureRecognized(DragGestureEvent e) {
        }
     
        public void dragDropEnd(DragSourceDropEvent e) {
        }
     
        public void dragExit(DragSourceEvent e) {
        }
     
        public void dropActionChanged(DragSourceDragEvent e) {
        }
     
        public void dragOver(DragSourceDragEvent e) {
        }
     
        public void dragEnter(DragSourceDragEvent e) {
        }
     
        public void drop(DropTargetDropEvent e) {
            System.out.println("rire");
            if (e.isDataFlavorSupported(Materiel.materielDataFlavor)) {
                e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            }
            else {
                e.rejectDrop();
                return;
            }
            Transferable t = e.getTransferable();
            try {
                droppedMateriel = (Materiel) t.getTransferData(Materiel.materielDataFlavor);
                droppedPoint = e.getLocation();
            }
            catch (Exception ex) {
                e.dropComplete(false);
                return;
            }
            e.dropComplete(true);
            Point position = e.getLocation();
            System.out.println(position);
            getGraphLayout().getGraph().addVertex(droppedMateriel);
        }
     
        public void dragExit(DropTargetEvent e) {
        }
     
        public void dropActionChanged(DropTargetDragEvent e) {
        }
     
        public void dragOver(DropTargetDragEvent e) {
        }
     
        public void dragEnter(DropTargetDragEvent e) {
     
        }
     
    }

    Je me rend bien compte que j'en demande bcp là a paster tout mon code, mais je galere avec ca depuis des jours et ca commence a m inquieter, je dois pas piger quelque chose ...

    Merci d'avance de m'aider et de demander un eclaircissement si besoin est

  2. #2
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Tout résolu en passant par TransferHandler (bien plus propre et clair que les interfaces Drag et compagnie) .

    Au final je ne passe même pas par java.awt.dnd


  3. #3
    Membre confirmé 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
    Points : 554
    Points
    554
    Par défaut
    Je sais pas exactement ce que tu as fait, mais je met un lien qui pourra être utile à d'autres : http://www.iut.univ-paris8.fr/~rosmo...e/dragAndDrop/

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

Discussions similaires

  1. ExtJs 4 - Grid - Drag and Drop - Ne pas rendre une ligne draggable
    Par ROD_M6C dans le forum Ext JS / Sencha
    Réponses: 4
    Dernier message: 20/12/2011, 22h54
  2. Réponses: 6
    Dernier message: 18/12/2007, 09h16
  3. drag and drop march pas sous firefox+joomla!
    Par tecap dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/10/2007, 10h16
  4. [Drag and Drop] qu'est ce qui ne va pas ?
    Par Lady dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/05/2007, 11h36

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