Bonjour,
Mon but est, que pour chaque noeud d'un JTree l'utilisateur puisse cliquer sur plusieurs boutons tel que "delete" ou "upload" sans avoir à selectionner le noeud. Cependant, jusqu'à maintenant je suis obligé de le selectionner.
J'ai donc créé un Renderer qui retourne un Panel contenant un "DefaultTreeCellRenderer" + 2 JLabels avec des icônes correspondant à leur rôle.
J'ai ensuite créé l'éditeur pour pouvoir permettre à l'utilisateur de cliquer sur les labels. Cela fonctionne très bien, toutefois l'utilisateur est obligé de selectionner le noeud avant de pouvoir l'éditer et ainsi cliquer sur les labels.
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 public class TreeNodeRenderer extends DefaultTreeCellRenderer implements TreeCellRenderer { private JPanel panel1 = new JPanel(); private JLabel delete = new JLabel(""); private JLabel upload = new JLabel(""); public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { // // DELETE label // delete.setName("delete"); delete.setIcon(new ImageIcon("Data/trash.png")); // // UPLOAD label // upload.setName("upload"); upload.setIcon(new ImageIcon("Data/app_up.png")); DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); Color backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor(); Color backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor(); if(selected) panel1.setBackground(backgroundSelectionColor); else panel1.setBackground(backgroundNonSelectionColor); component = (DefaultTreeCellRenderer) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); panel1.add(component); panel1.add(delete); panel1.add(upload); return panel1; } }
Je retourne pourtant bien "false" dans la méthode "shouldSelectCell".
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 public class TreeNodeEditor extends AbstractCellEditor implements TreeCellEditor { /** * */ private static final long serialVersionUID = 1L; private TreeNodeRenderer renderer; public TreeNodeEditor(TreeNodeRenderer treeRenderer) { this.renderer = treeRenderer; //Change le curseur quand celui-ci se trouve sur un label renderer.getDeleteButton().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); renderer.getUploadButton().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); renderer.getDownloadButton().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //Ajout des listeners lors du passage du curseur sur un label addLabelMouseListener(renderer.getDeleteButton()); addLabelMouseListener(renderer.getUploadButton()); } public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { ... return renderer.getTreeCellRendererComponent( tree, value, isSelected, expanded, leaf, row, true); } public boolean isCellEditable(EventObject anEvent) { return true; } public boolean shouldSelectCell(EventObject anEvent) { return false; } public boolean stopCellEditing() { return super.stopCellEditing(); } public void cancelCellEditing() { super.cancelCellEditing(); } public void addCellEditorListener(CellEditorListener l) { super.addCellEditorListener(l); } public void removeCellEditorListener(CellEditorListener l) { super.removeCellEditorListener(l); } public Object getCellEditorValue() { return null; } }
Quelqu'un a-t-il une idée ?
Partager