bonjour
je voudrais faire un drag'n drop d'un jtree vers un jlabel contenant une image.
je sais que c'est possible car je l'ai déjà fait, "in vitro", c'est-à-dire dans un projet à part dédié seulement à celà.
mais lorsque je transpose le code vers mon projet principal, je peux faire le drag à partir du jtree (l'icône de la souris change) mais pour le drop vers le jlabel, l'icône devient un "panneau de sens interdit".
j'ai bien comparé les 2 codes, je ne vois aucune différence, l'erreur doit venir d'autre part mais je ne vois pas d'où.
voici le code :
dans Fenetre.java (classe affichant le fenêtre principale)
TreeTH, la classe étendant TransfertHandler, sert à implémenter le drop sur l'image du jlabel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 JLabel lbl_poub_local = new JLabel(new ImageIcon("ressources/corbeille.jpg")); lbl_poub_local.setBounds(490, 46, 150, 150); lbl_poub_local.setName("poubelle2"); lbl_poub_local.setTransferHandler(new TreeTH(tree_local));
MonTH.java, code du drag, à partir 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 public class TreeTH extends TransferHandler { private static final DataFlavor flavors[] = { TreeElementsTransferableTransferableFactory.getTreeElemFlavor() }; public JTree tree = null; public TreeTH(JTree tree) { super(); this.tree = tree; System.out.println("dans le constructeur de TreeTH : " + this.tree); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * DROP */ @Override public boolean importData(JComponent comp, Transferable t) { System.out.println("drop poubelle : dans la méthode importData"); if (comp.getName().contains("poubelle")) { TreeElementsTransferable sel = null; try { sel = (TreeElementsTransferable) t.getTransferData(TreeElementsTransferableTransferableFactory .getTreeElemFlavor()); } catch (UnsupportedFlavorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DefaultTreeModel bm = (DefaultTreeModel) (tree.getModel()); bm.removeNodeFromParent((DefaultMutableTreeNode) sel.chemin.getLastPathComponent()); bm.reload(); expandAll(tree, true); return true; } return false; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { System.out.println("dans canImport"); for (int i = 0, n = transferFlavors.length; i < n; i++) for (int j = 0, m = flavors.length; j < m; j++) if (flavors[j].equals(transferFlavors[i])) { return true; } return false; }
je peux vous expliquer si il y a du code à détailler.
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 /* * DRAG */ @Override public int getSourceActions(JComponent c) { return TransferHandler.COPY; } @Override protected Transferable createTransferable(JComponent c) { System.out.println("drag : " + c.getName()); if (c.getName().contains("lis")) { System.out.println(((JList) c).getName()); String genre = null; String texte = null; // retour : il y a une valeur retournee boolean retour = false; JList la_liste = (JList) c; if ((la_liste.getName().contains("lis")) && (la_liste.getName().contains("sites"))) { genre = "site"; retour = true; } if ((la_liste.getName().contains("lis")) && (la_liste.getName().contains("types"))) { genre = "type"; retour = true; } if (!retour) return null; texte = (String) la_liste.getSelectedValue(); return new SelectionTransferable(genre, texte); } else if (c.getName().contains("tree")) { JTree tree = (JTree) c; DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (noeud.getLevel() == 1) { // c'est un site System.out.println("MonTH drag, site : " + getPath(noeud)); return new TreeElementsTransferable(getPath(noeud)); } if (noeud.getLevel() == 2) { // c'est un type System.out.println("MonTH drag, type : " + getPath(noeud)); return new TreeElementsTransferable(getPath(noeud)); } } return null; }
merci,
olivier
ps : le code dans le constructeur de TreeTH ne semble pas s"exécuter (le system.out.writeln n'envoie rien à la console)
Partager