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.

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;
	}
}
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.

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 ?