Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

texte tronqué dans le JTree

2 réponses
Avatar
Jean-Marie
bonjour

ce pb a été soulevé plusieurs fois dans ce newsgroup
et ailleurs mais les solutions que j'ai pu tester
n'ont pas résolu mon pb !
j'essaie de mettre à jour le texte d'une feuille d'un JTree
mais dès que ce texte dépasse la taille du texte original
le nouveau texte est tronqué (avec ... à la fin)

mon code (simplifié) est le suivant :

static JTree tree;

renderer = new MyRenderer(icon);
tree.setCellRenderer(renderer);

class MyRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component component=super.getTreeCellRendererComponent(
tree, value, sel,
expanded, leaf, row,
hasFocus);
setText("nouveau texte plus long");
treeModel.nodeChanged(node);
return this;
}

le treeModel.nodeChanged(node); ne change rien

j'ai essayé dans la méthode getTreeCellRendererComponent toute sorte de
méthode (validate(), updateUI()...) ; je ne m'en sort qu'en fixant la
largeur à une valeur suffisamment grande avec setPreferredSize !

Merci pour votre aide

Jean-Marie

2 réponses

Avatar
Simon OUALID
Je ne vois pas sert ta spécialisation de DefaultTreeCellRenderer. Mais
bon : vérifie la preferredSize de ton renderer après le setText, c'est
assez étonnant qu'elle ne soit pas mise à jour (jamais rencontré ce
problème, pourquoi dois tu faire ce setText(), pourquoi ne met tu pas à
jour l'objet dans ton modèle avant de faire le fire qui va bien ?).

Bref, si tu tiens à faire comme ça, tente un invalidate() et un
doLayout() et vois si ça donne quelque chose.

Si ça ne marche pas, utilise getFontMetrics().charWidth(s) sur ton texte
pour redéfinir toi même la preferredSize de ton composant avant le
invalidate(), mais c'est crade et bizarre d'en arriver la.

Dommage que ton code ne compile pas, ça empêche de tester rapidement ce
qu'on avance ! ;)



Jean-Marie wrote:
bonjour

ce pb a été soulevé plusieurs fois dans ce newsgroup
et ailleurs mais les solutions que j'ai pu tester
n'ont pas résolu mon pb !
j'essaie de mettre à jour le texte d'une feuille d'un JTree
mais dès que ce texte dépasse la taille du texte original
le nouveau texte est tronqué (avec ... à la fin)

mon code (simplifié) est le suivant :

static JTree tree;

renderer = new MyRenderer(icon);
tree.setCellRenderer(renderer);

class MyRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component component=super.getTreeCellRendererComponent(
tree, value, sel,
expanded, leaf, row,
hasFocus);
setText("nouveau texte plus long");
treeModel.nodeChanged(node);
return this;
}

le treeModel.nodeChanged(node); ne change rien

j'ai essayé dans la méthode getTreeCellRendererComponent toute sorte de
méthode (validate(), updateUI()...) ; je ne m'en sort qu'en fixant la
largeur à une valeur suffisamment grande avec setPreferredSize !

Merci pour votre aide

Jean-Marie








Avatar
Jean-Marie
bonjour

en fait en cliquant sur un objet feuille de mon arbre à gauche,
j'affiche à droite un panel avec les caractéristiques
de cet objet ; je peux en autre chose modifier le texte de ce noeud ;
l'arborescence est simple puisqu'il y a un noeud racine
avec une liste de noeuds fils ; le texte du noeud
racine ne change pas alors que celui des fils peut changer ;
pour le codage j'ai repris l'exemple du tutorial qui montre
commnet changer le texte en considérant 2 cas ; donc en fait dans
mon code j'ai le teste suivant :

if (node.getUserObject() instanceof Alerte) {
setText(((AlerteEx)node.getUserObject()).getTitre()); // fils
else
setText(Param.m("aboutalarmtitle")); // noeud racine


j'ai essayé ce que tu ma dit mais même en changeant la largeur
dans setpreferredsize à la volée cette nouvelle valeur n'est jamais pris
en compte (il bloque toujours sur le 1er setpreferredsize)

je vais voir si je peux faire qch qu niveau du modèle



Je ne vois pas sert ta spécialisation de DefaultTreeCellRenderer. Mais
bon : vérifie la preferredSize de ton renderer après le setText, c'est
assez étonnant qu'elle ne soit pas mise à jour (jamais rencontré ce
problème, pourquoi dois tu faire ce setText(), pourquoi ne met tu pas à
jour l'objet dans ton modèle avant de faire le fire qui va bien ?).

Bref, si tu tiens à faire comme ça, tente un invalidate() et un
doLayout() et vois si ça donne quelque chose.

Si ça ne marche pas, utilise getFontMetrics().charWidth(s) sur ton texte
pour redéfinir toi même la preferredSize de ton composant avant le
invalidate(), mais c'est crade et bizarre d'en arriver la.

Dommage que ton code ne compile pas, ça empêche de tester rapidement ce
qu'on avance ! ;)



Jean-Marie wrote:

bonjour

ce pb a été soulevé plusieurs fois dans ce newsgroup
et ailleurs mais les solutions que j'ai pu tester
n'ont pas résolu mon pb !
j'essaie de mettre à jour le texte d'une feuille d'un JTree
mais dès que ce texte dépasse la taille du texte original
le nouveau texte est tronqué (avec ... à la fin)

mon code (simplifié) est le suivant :

static JTree tree;

renderer = new MyRenderer(icon);
tree.setCellRenderer(renderer);

class MyRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component component=super.getTreeCellRendererComponent(
tree, value, sel,
expanded, leaf, row,
hasFocus);
setText("nouveau texte plus long");
treeModel.nodeChanged(node);
return this;
}

le treeModel.nodeChanged(node); ne change rien

j'ai essayé dans la méthode getTreeCellRendererComponent toute sorte
de méthode (validate(), updateUI()...) ; je ne m'en sort qu'en fixant
la largeur à une valeur suffisamment grande avec setPreferredSize !

Merci pour votre aide

Jean-Marie