Drag 'n drop d'un JTree vers un JLabel
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)
Code:
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)); |
TreeTH, la classe étendant TransfertHandler, sert à implémenter le drop sur l'image du jlabel
Code:
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;
} |
MonTH.java, code du drag, à partir du jtree:
Code:
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;
} |
je peux vous expliquer si il y a du code à détailler.
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)