bonjour

j'ai implémenté un drag'n drop entre :
-2 JLists et un JTree
-ce JTree et un JLabel contenant une image

et le tout 2 fois dans une fenêtre swing.

La première fois, ça marche nickel.
l'autre j'arrive faire le drag à partir des JLists mais pas le drop sur le JTree : j'ai un icône me disant que le drop est refusé (une sorte de panneau d'interdiction).

je ne sais pas d'où vient le problème, dans les 2 cas j'ai :
-la même classe héritant de TransfertHandler, et appel de setTransfertHandler
-un appel de setDragEnabled()

voici le code :

le transfertHandler, il y a une partie pour le drag, et une pour le drop
l'erreur peut venir du drop sur le 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
public class MonTH extends TransferHandler {
 
    private static final DataFlavor flavors[] = { SelectionTransferableFactory.getSelTransFlavor() };
 
    public MonTH() {
        super();
    }
 
    /*
     * DROP
     */
    @Override
    public boolean importData(JComponent comp, Transferable t) {
 
        if (comp.getName().contains("tree")) {
            System.out.println("arbre identifie");
            SelectionTransferable sel = null;
            try {
                sel = (SelectionTransferable) t.getTransferData(SelectionTransferableFactory.getSelTransFlavor());
            } catch (UnsupportedFlavorException e) {
 
                e.printStackTrace();
                System.out.println("1" + e);
            } catch (IOException e) {
 
                e.printStackTrace();
                System.out.println("2" + e);
            }
            JTree tree = (JTree) comp;
 
            int niveau = 0;
            if (((DefaultMutableTreeNode) (tree.getLastSelectedPathComponent())).getLevel() == 0)
                niveau = 1;
 
            System.out.println("genre : " + sel.getGenre());
            TreeNode[] path = ((DefaultMutableTreeNode) (tree.getLastSelectedPathComponent())).getPath();
            for (TreeNode treeNode : path) {
                System.out.println("element : " + treeNode);
            }
            if ((niveau == 1) && (sel.getGenre().equals("site"))) {
                DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                ((DefaultMutableTreeNode) tree.getModel().getRoot()).insert(new DefaultMutableTreeNode(sel.getTexte()),
                        ((DefaultMutableTreeNode) (tree.getModel().getRoot())).getChildCount());
 
                DefaultTreeModel bm = (DefaultTreeModel) (tree.getModel());
                bm.reload();
                expandAll(tree, true);
 
                /*
                 * enregistrement sur disque
                 */
                FileOutputStream fos = null;
                ObjectOutputStream out = null;
                try {
                    fos = new FileOutputStream("enreg_sites_types.txt");
                    out = new ObjectOutputStream(fos);
                    out.writeObject(Fenetre_2.tree_oracle);
                    out.close();
                } catch (IOException ex1) {
                    ex1.printStackTrace();
                }
 
                return true;
            }
 
            if (((DefaultMutableTreeNode) (tree.getLastSelectedPathComponent())).getLevel() == 1)
                niveau = 2;
 
            if ((niveau == 2) && (sel.getGenre().equals("type"))) {
 
                DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                noeud.add(new DefaultMutableTreeNode(sel.getTexte()));
 
                DefaultTreeModel bm = (DefaultTreeModel) (tree.getModel());
                bm.reload();
                expandAll(tree, true);
 
                /*
                 * enregistrement sur disque
                 */
                FileOutputStream fos = null;
                ObjectOutputStream out = null;
                try {
                    fos = new FileOutputStream("enreg_sites_types.txt");
                    out = new ObjectOutputStream(fos);
                    out.writeObject(Fenetre_2.tree_oracle);
                    out.close();
                } catch (IOException ex1) {
                    ex1.printStackTrace();
                    System.out.println("3" + ex1);
                }
 
                return true;
            }
 
            return false;
 
        }
        // si le drop se fait sur la corbeille
        else {
            return false;
        }
 
    }
 
    @Override
    public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
 
        // if (!(comp instanceof JList))
        // return false;
 
        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;
 
    }
 
    /*
     * 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;
 
    }
dans ma fenêtre, j'ai dans la méthode initialize:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
tree_oracle.setName("tree_oracle");
        tree_oracle.setTransferHandler(new MonTH());
        tree_oracle.setDragEnabled(true);
        tree_local.setName("tree_local");
        tree_local.setTransferHandler(new MonTH());
        tree_local.setDragEnabled(true);
le problème concerne le tree_oracle

un exemple du code des jlists, dans la même méthode que précédemment:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
final JList<String> lst_oracle_sites = new JList<String>(new DefaultListModel<String>());
        lst_oracle_sites.setName("lis_sites_oracle");
        lst_oracle_sites.setTransferHandler(new MonTH());
        lst_oracle_sites.setDragEnabled(true);
et enfin le code qui semble être une différence entre les 2 arbres : le tree_oracle est chargé au début de la méthode initialize, AVANT LES MODIFICATIONS DE SES PARAMETRES vues plus haut(setdragenabled, etc):

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
FileInputStream fis = null;
        ObjectInputStream in = null;
        try {
            fis = new FileInputStream("enreg_sites_types.txt");
            in = new ObjectInputStream(fis);
            tree_oracle = (JTree) in.readObject();
            in.close();
        } catch (IOException | ClassNotFoundException ex) {
 
            ex.printStackTrace();
            tree_oracle = new JTree(new DefaultMutableTreeNode("root"));
            FileOutputStream fos = null;
            ObjectOutputStream out = null;
            try {
                fos = new FileOutputStream("enreg_sites_types.txt");
                out = new ObjectOutputStream(fos);
                out.writeObject(tree_oracle);
                out.close();
            } catch (IOException ex1) {
                ex.printStackTrace();
            }
 
        }
J'ai cette exception lors du drop sur le JTree:
java.lang.NullPointerException
at javax.swing.TimerQueue.containsTimer(TimerQueue.java:157)
at javax.swing.Timer.isRunning(Timer.java:561)
at javax.swing.JTree.cancelDropTimer(JTree.java:1497)
at javax.swing.JTree.dndDone(JTree.java:1463)
at javax.swing.TransferHandler$DropHandler.cleanup(TransferHandler.java:1564)
at javax.swing.TransferHandler$DropHandler.dragExit(TransferHandler.java:1508)
at java.awt.dnd.DropTarget.dragExit(DropTarget.java:426)
at javax.swing.TransferHandler$SwingDropTarget.dragExit(TransferHandler.java:1262)
at sun.awt.dnd.SunDropTargetContextPeer.processExitMessage(SunDropTargetContextPeer.java:401)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchExitEvent(SunDropTargetContextPeer.java:838)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:772)
at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
at java.awt.Component.dispatchEventImpl(Component.java:4716)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4612)
at java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:4558)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4417)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Quelqu'un saurait-il m'expliquer d'où peut venir ce problème ?

Merci d'avance pour votre aide.