bonsoir
j'aimerais créer un drag and drop entre 2 jlist et un jtree.
une des 2 jlist est la liste des "sites", destinés à être des enfants du noeud root dans l'arbre.
la 2e jlist est la liste des "types", dont la place est d'être des enfants de noeuds "sites" dans l'arbre.
ainsi par ex on a:
(voir image jointe)
lorsque je lance mon programme j'ai le drag à partir des jlist qui se fait (curseur de drag and drop - insertion) mais si je passe le curseur sur le jtree le curseur devient un panneau d'interdiction du drag and drop.
pourtant la méthode canImport du transfertHandler renvoie true...
voici mon code:
Fenetre.java
mon TH.java (TH=transfertHandler)
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 package GUI.DnD_what_is_exported_from_jlist; import java.awt.BorderLayout; import java.awt.FlowLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.border.EmptyBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; public class Fenetre extends JDialog { private final JPanel contentPanel = new JPanel(); final private JTextField tfi_texte; /** * Launch the application. */ public static void main(String[] args) { try { Fenetre dialog = new Fenetre(); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } /** * Create the dialog. */ public Fenetre() { setBounds(100, 100, 452, 322); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(null); final JList lis_sites = new JList(); lis_sites.setName("lis_sites"); lis_sites.setBounds(10, 49, 175, 72); lis_sites.setTransferHandler(new MonTH()); contentPanel.add(lis_sites); tfi_texte = new JTextField(); tfi_texte.setBounds(195, 47, 86, 20); contentPanel.add(tfi_texte); tfi_texte.setColumns(10); tfi_texte.setDragEnabled(true); { JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { JButton okButton = new JButton("OK"); okButton.setActionCommand("OK"); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); } { JButton cancelButton = new JButton("Cancel"); cancelButton.setActionCommand("Cancel"); buttonPane.add(cancelButton); } } // add item into the jlist DefaultListModel<String> model = new DefaultListModel<>(); lis_sites.setModel(model); model.add(0, "mario"); // DnD lis_sites.setDragEnabled(true); JTree tree = new JTree(); tree.setBounds(195, 78, 72, 64); contentPanel.add(tree); DefaultTreeModel mod_tree = new DefaultTreeModel(new DefaultMutableTreeNode("root")); tree.setModel(mod_tree); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); // DnD tree.setDragEnabled(true); JList lis_types = new JList(); lis_types.setName("lis_types"); lis_types.setBounds(10, 168, 174, 72); lis_types.setTransferHandler(new MonTH()); contentPanel.add(lis_types); // add item into the jlist DefaultListModel<String> model_types = new DefaultListModel<>(); lis_types.setModel(model); model.add(0, "kart"); JLabel lblSites = new JLabel("SITES"); lblSites.setBounds(10, 24, 46, 14); contentPanel.add(lblSites); JLabel lblTypes = new JLabel("TYPES"); lblTypes.setBounds(10, 143, 46, 14); contentPanel.add(lblTypes); } }
SelectionTransferable.java
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 package GUI.DnD_what_is_exported_from_jlist; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JTree; import javax.swing.TransferHandler; import javax.swing.tree.DefaultMutableTreeNode; public class MonTH extends TransferHandler { private static final DataFlavor flavors[] = { SelectionTransferableFactory.getSelTransFlavor() }; /* * DROP */ @Override public boolean importData(JComponent comp, Transferable t) { SelectionTransferable sel = null; try { sel = (SelectionTransferable) t.getTransferData(SelectionTransferableFactory.getSelTransFlavor()); } catch (UnsupportedFlavorException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } JTree tree = (JTree) comp; int niveau = 0; if (tree.getSelectionPath().getParentPath().toString().equals("root")) { niveau = 1; } if (tree.getSelectionPath().getParentPath().getParentPath().toString().equals("root")) { niveau = 2; } if ((niveau == 1) && (sel.getGenre().equals("site"))) { DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); noeud.add(new DefaultMutableTreeNode(sel.getTexte())); return true; } if ((niveau == 2) && (sel.getGenre().equals("type"))) { DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); noeud.add(new DefaultMutableTreeNode(sel.getTexte())); return true; } 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(((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().equals("lis_sites")) { genre = "site"; retour = true; } if (la_liste.getName().equals("lis_types")) { genre = "type"; retour = true; } if (!retour) return null; texte = (String) la_liste.getSelectedValue(); return new SelectionTransferable(genre, texte); } }
et enfin
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 package GUI.DnD_what_is_exported_from_jlist; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; public class SelectionTransferable implements Transferable { private String genre = null; private String texte = null; public SelectionTransferable(String genre, String texte) { this.genre = genre; this.texte = texte; } @Override public DataFlavor[] getTransferDataFlavors() { DataFlavor[] result = new DataFlavor[1]; result[0] = SelectionTransferableFactory.getSelTransFlavor(); // result[1] = DataFlavor.stringFlavor; return result; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return SelectionTransferableFactory.getSelTransFlavor().equals(flavor); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (SelectionTransferableFactory.getSelTransFlavor().equals(flavor)) { return this; } throw new UnsupportedFlavorException(flavor); } public String getGenre() { return genre; } public void setGenre(String genre) { this.genre = genre; } public String getTexte() { return texte; } public void setTexte(String texte) { this.texte = texte; } }
SelectionTransferableFactory.java
(peu important, la classe est destinée à fournir le type de DataFlavor associé au SelectionTransferable)
merci
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 package GUI.DnD_what_is_exported_from_jlist; /* * This file is distributed according to the GNU Lesser Public Licence. * Created on 5 avr. 2005 * */ import java.awt.datatransfer.DataFlavor; /** * Contient une constante DataFlavor pour les personnes. Celle-ci aurait pu * aussi être rangée dans PersonneTransferable. * * @author Serge Rosmorduc */ public class SelectionTransferableFactory { private static String mimeType = DataFlavor.javaJVMLocalObjectMimeType + ";class=" + SelectionTransferable.class.getName(); private static DataFlavor selTransFlavor = null; public static DataFlavor getSelTransFlavor() { // Try to create a DataFlavor for color. try { selTransFlavor = new DataFlavor(mimeType); } catch (ClassNotFoundException e) { } return selTransFlavor; } }
olivier.
Partager