Bonjour,
j'aimerais faire qq chose qui parait simple, mais je n'y arrive pas : changer la couleur (du fond ou de la police) d'un element de mon JTree.
Est-ce possible ?
Version imprimable
Bonjour,
j'aimerais faire qq chose qui parait simple, mais je n'y arrive pas : changer la couleur (du fond ou de la police) d'un element de mon JTree.
Est-ce possible ?
Tout est possible :D
Passe par un TreeCellRenderer. Y a déjà eu beaucoup de post à ce sujet.
une fois que tu as déclaré cette class, tu peux l'appliquer a ton JTree comme suit :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 class MyTreeCellRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,boolean expanded, boolean leaf, int row, boolean hasFocus) { /* Apres tu fais qqchose du genre */ if(value.equals(ce que tu veux)) { setBackground(Color.YELLOW); } return this; } }
et voila le tour est jouéCode:
1
2
3 JTree monJTree = new JTree(); monJTree.setCellRenderer(new MyTreeRenderer());
Le problème c'est que la modif du background s'effectue sur tt l'arbre et je veux le faire que sur un noeud ...
Quel est la particularité de ce noeud dans l'arbre?
Parce que ce que je t ai donné peut te permettre de ne surligner qu un seul noeud. Ou de colorier les noeud en fonction de leur propriété.
Je pourrais mieu t aider si tu me dit qq est le type de donnée que tu as dans ton arbre. Et quelle est la particularité du noeud à surligner par rapport au autres.
LEs noeuds ne contiennent que du texte et le nd que dont je veux changer la couleur, est le nd sur lequel j'ai cliqué
Dans ce cas tu auras le code suivant pour la classe du TreeCellRenderer
et lors de la déclaration de ton arbre tu ajoute ca :Code:
1
2
3
4
5
6
7
8
9
10
11 class MyTreeCellRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,boolean expanded, boolean leaf, int row, boolean hasFocus) { if(sel) { setBackground(Color.YELLOW); //Ou la couleur que tu veux } return this; } }
Fais moi confiance ca marche.Code:
1
2 JTree tonArbre = new JTree(); tonArbre.setCellRenderer(new MyTreeCellRenderer());
Bon, j'ai fait exactement comme tu me l'as dit mais maintenant le texte de mon arbre n'est plus visible 8O
Logiquement ca devrait marché
essai en détailant un peu plus comme ca :
On va finir par y arrivé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class MyTreeCellRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,boolean expanded, boolean leaf, int row, boolean hasFocus) { setText((String)value); setForeground(Color.BLACK); setFont(new Font("Courrier",Font.BOLD,FONT_SIZE)); if(sel) { setForeground(Color.YELLOW); //Ou la couleur que tu veux } return this; } }
Apres c a toi de personnaliser comme tu le sens
Ok, le texte apparait maintenant comme avant, mais la couleur ne change jamais :(
Effectivement le setBackground ne marchait pas.
Je t fais un petit exemple qui marche parfaitement.
Apres a toi de l adapter
Code:
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 import javax.swing.*; import javax.swing.tree.*; import java.awt.*; public class Test1 extends JFrame{ public Test1() { super("test"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String arg[]) { Test1 frame = new Test1(); frame.setSize(500,500); DefaultMutableTreeNode racine = new DefaultMutableTreeNode("Copains"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Toto"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Tata"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("Tutu"); racine.add(node1); racine.add(node2); racine.add(node3); JTree jt = new JTree(); jt.setCellRenderer(new MyTreeCellRenderer()); DefaultTreeModel dtm = new DefaultTreeModel(racine); jt.setModel(dtm); JScrollPane jsp = new JScrollPane(jt); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(jsp,BorderLayout.CENTER); frame.setVisible(true); } } class MyTreeCellRenderer extends JTextArea implements TreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,boolean expanded, boolean leaf, int row, boolean hasFocus) { DefaultMutableTreeNode dmt = (DefaultMutableTreeNode)value; Object o = dmt.getUserObject(); setText((String)o); setBackground(Color.WHITE); setFont(new Font("Courrier",Font.BOLD,12)); if (sel) { System.out.println((String)o); setBackground(Color.YELLOW); //Ou la couleur que tu veux } return this; } }
Je suis blazé !
Ton code marche très bien effectivement, mais le mien non !
En fait, il affiche bien le nom de l'elt selectionné mais il ne change pas la couleur ! 8O
JE comprends pas, j'ai fait comme toi pourtant ...
[EDIT] J'AI RIEN DIT ! :D J'avais pas vu :
class MyTreeCellRenderer extends JTextArea implements TreeCellRenderer
:oops: Desolé, ca marche nickel maintenant, MERCI A TOI :!: