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
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 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); } }
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 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); } }
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
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); } }
Et un 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(); } }
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).
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";} }
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:
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
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; }
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
Partager