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 : 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));
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
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 : 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;
 
	}
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)