Bonjour,
je travaille actuellement sur la mise à jour d'un projet qui représente l'état d'un hardware. voici le contexte :
le hardware m'envoie des informations sur son état. Pour faire cela, il met à jour un modelle (classe java) qui contient toutes les informations qui me sont utiles.
J'ai un Jtree qui represente les différents composants de mon hardware et qui se met à jour quand le modelle est mis à jour. Cette mise à jour prend deux formes, soit je mets un icone pour donner l'état du hardware (en fonctionnement, etat dégradé, en panne), soit je mets à jour le noeud pour mettre par exemple la température.
voici comment a été initialiser le Jtree :
les 2 listeners qui sont utilisés font un repaint de l'arbre. La map me permet de lier l'objet du modelle à un noeud de mon arbre.
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 private void listComposant() { DefaultMutableTreeNode racine = new DefaultMutableTreeNode(modele.getSystem().getIdent().getFullName()); listcomposant = modele.getSonarSystem().getContent(); for (MonComposant composant : listcomposant.getItems()) { nom = composant.getIdent().getFullName(); if (composant instanceof CompInfo) { nom += " : " + ((CompInfo) composant).getInfo(); ((CompInfo) composant).addListener(infoListener); mapModele.put(((CompStatus) composant ).getStatus(), subNode); }else if (composant instanceof CompStatus) { ((CompStatus) composant ).getStatus().addVariableListener(StatusListener); mapModele.put(((CompStatus) composant ).getStatus(), subNode); } DefaultMutableTreeNode node = new DefaultMutableTreeNode(nom); racine.add(node); } status = new TreeStatus(this); arbre = new JTree(this.racine); arbre.setRootVisible(true); arbre.setCellRenderer(status); arbre.setVisible(true); }
Pour la mise à jour de l'arbre j'ai la classe TreeStatus qui étend DefaultTreeCellRenderer ou j'ai surchargé getTreeCellRendererComponent comme suit :
La mise à jour de l'icone fonctionne très bien, par contre la mise à jour du noeud (dans le else) pose un souci, car losque le text affiché est plus grand que le text original il se termine par "...". J'ai pas mal parcourus le net avant de poster, et les différentes possibilités que j'ai trouvé ne fonctionnent pas.
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 public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); MonComposant composant = arbrePanel.getModeleMap().get((TreeNode) value); if (composant instanceof CompStatus) { StatusEnum statut = ((CompStatus) composant).getStatus().getValue(); // get the status' icon switch (statut) { case TDAMAGED: setIcon(new ImageIcon("cercle-orange-icone.png")); break; case TNOMINAL: setIcon(new ImageIcon("cercle-vert-icone.png")); break; case TFAILED: setIcon(new ImageIcon("cercle-rouge-icone.png")); break; case TUNKNOWN: case TNOTTESTED: setIcon(new ImageIcon("cercle-gris-icone.png")); break; default: setIcon(new ImageIcon("cercle-gris-icone.png")); break; } }else {//case of comp info and racine if(composant instanceof CompInfo){ String text = composant.getIdent().getFullName() + " : " + ((CompInfo)composant).getInfo(); ((DefaultMutableTreeNode)value).setUserObject(text); setText(text); } setIcon(null); } return this; }
J'ai essayer d'ajouter à l'init de l'arbre
j'ai essayé de faire des validate, revalidate, repaint apres le settext ça ne fonctionne pas non plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 arbre.setLargeModel(true); //ne fonctionne pas
J'ai essayé de faire un setSize(), un setPreferedSize(); pas mieux.
j'ai essayé de cumuler les 2 solutions précedentes, rien y fait.
Les solutions que j'ai trouvé par ailleur se faisaient hors du DefaultCellRenderer du coup elles ne sont pas applicables à mon cas.
remarque personnelle : je pense qu'il aurait fallut mettre directement les objets du modelle de stockage de l'état du harware dans l'arbre pour éviter de faire des listener inutiles qui ne font qu'un repaint de l'arbre. Et ensuite gérer l'affichage dans les TreecellRenderer tel que c'est fait maintenant, mais je ne pense pas que cela résoudra mon problème de taille du noeud.
si vous avez une idée de ce qui m'échappe pour resizer le Jlabel du noeud je suis prenneur.
cordialement,
Obtraba
Partager