[JTree] taille de l'affichage du texte d'un noeud

cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 - 9 juin 2006 à 12:25
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 - 10 juin 2006 à 00:27
Bonjour,

Je souhaite modifier l'affichage du texte des noeuds d'un JTree selon le choix de l'utilisateur.

Pour cela j'utilise setUserObject pour chaque noeud en recreeant ce dernier par le nouveau texte.
Ensuite je fais un updateUI pour le rafraichissement.

Tout fonctionne sauf quesi le texte depasse la taille de l'ancien texte, il n'est pas affiché entierement (se termine par '...') meme si il y a de la place pour l'affichage (en plus mon JTree est dans une JScrollPane)

En creant completement un Arbre ca fonctionne car le noeud (largeur) prend la taille du texte (donc pas de remplacement par les '...') mais par un changement sans recréation, ca ne modifie pas la taille de creation de base.

Y a-t-il une méthode pour résoudre ce problème ? je n'en ai pas trouvé, mais je galère un peu avec les noms des méthodes des Arbres.

Le DefaultMutableTreeNode est recréé dans le setUserObject.

Merci
Cbil

12 réponses

cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 12:29
Je viens de remarquer un truc par contre. Pour le texte de la racine, il n'y a pas de problème, la taille de l'affichage du texte du noeud s'est correctement agrandi (pas de remplacement avec les '...' )

a+
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 juin 2006 à 12:57
Salut,


regarde du coté de DefaultTreeCellRenderer redefini le et fai ton petit
job dedans perso je ne sais pas si ca fonctionne avec des textes mais
je l'utilise pour mettre dynamiquement une image differente pour chacun
des noeud de l'arbre


a savoir dans l'objet DefaultTreeCellRenderer il y a la methode :


public final Component getTreeCellRendererComponent(JTree tree,

            Object value, boolean sel, boolean expanded, boolean leaf, int row,

            boolean hasFocus)


cette methode contient un champ value ce champs et par defaut instance de jlabel qui represente un noeud


va faire un tour sur le how to de sun tu as pas mal d'info sur les jtree

WORA
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 14:28
Merci beaucoup, en allant sur le how to , j'ai trouvé.
http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html#dynamic

Il fallait mettre : monArbre.setShowsRootHandles(true);

A+
Cbil
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 14:40
Euh non ca marche pas, ca l'air aleatoire en fait :(, je retourne sur how to lol ^^

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 16:13
J'ai toujours pas trouvé, j'ai testé plusieurs methodes mais rien a faire (dont également; dans le DefaultTreeCellRenderer)
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 16:32
Encore re,

Quand je disais que c'etait aleatoire, ce n'est evidemment pas le cas. J'ai trouvé quand est-ce que le probleme apparait ou non.

Des que l'arborescence est affiché, si un noeud est non visible (le parent n'a pas été déroulé) et qu'on le rend visible lorsqu'il y a le "plus long" texte de charger (second texte et non texte d'origine plus court) alors ca fonctionne, le noeud a pris la taille du long texte.

Quand on reharge le premier texte court, le noeud à garder la taille du texte long (ca se voit à la sélection d'un noeud) (donc forcement, le texte court est entierement visible).

La grandeur d'affichage est donc definit au premier affichage d'un noeud et non au chargement de la JTree dans le panel.

Si vous avez des idées ........

A+
Cbil
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 juin 2006 à 16:52
heu j'ai pas tt compris la faut etre bien clair un vendredi(mon cerval se prepare pour sa lobotomie du week end)

WORA
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 17:45
Lol oui à force d'ajouter du texte, je m'embrouille aussi ^^, désolé.

Admettons que j'ai l'arbre suivant :

RACINE
 *  Noeud1
-> Noeud2
  --> enfant1
  --> enfant2
  --> enfant3

Si je change le nom d'affichage de enfant2 par exemple à l'aide d'un bouton et de la methode enfant2.setUserObject(new NoeudArbre(enfant2.param1(), ....., "Nouveau nom"); (NoeudArbre est une classe extends DefaultMutableTreeNode) alors j'obtiens l'arbre suivant :

RACINE
 *  Noeud1
-> Noeud2
  --> enfant1
  --> Nouv...
  --> enfant3

-----------------------------------
Maintenant j'ai le meme arbre mais avec Noeud2 qui n'est pas déroulé. :

RACINE
 *  Noeud1
 *  Noeud2

les enfant de Noeud2 sont bien sur initialisé à enfant1, enfant2, enfant3.
Avant de double cliquer sur Noeud2 pour affiché ses enfants, je change le noeud de enfant2 par le meme texte que precedemment ("Nouveau nom") et la meme methode.

Voici ce que j'obtiens, un bon affichage :

RACINE
 *  Noeud1
-> Noeud2
  --> enfant1
  --> Nouveau nom
  --> enfant3

Mais si on remodifie le nom de "Nouveau nom" par "enfant2, et que l'on sélectionne ce noeud on se rend compte qu'il a conservé la taille de "Nouveau nom" :
[Nouveau nom   ---->   [enfant2           ]    (la taille n'a pas été remise à [enfant2]

  
CONCLUSION

La taille du JTree est initialisé lors du premier affichage du noeud concerné et non lors de la creation ou de l'affichage du JTree dans le panel.

Ensuite, en faisant un setPreferredSize, ca marche également pour changer le texte, mais je n'ai pas de solution pour avoir une taille correspondant au texte ecrit. (et en plus il doit y avoir plus simple)

a+,  merci beaucoup, et bon week-end !

Cbil
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 juin 2006 à 18:38
et tu as essayé d'updater l'ui du jtree apres la modification?

WORA
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
9 juin 2006 à 20:46
Oui bien sur, ^^

Sinon j'accepte une autre alternative à mon problème mais je sais pas comment faire. C'est à dire que je recréé completement mon arbre comme avant mais en plus je sélectionne le noeud precedemment sélectionné. Sauf que ca j'ai pas reussi, car il faut mettre un TreePath dans la methode set...quelquechose mais quand je recupere le TreePath du noeud , ca ne marche pas (à moins que je m'y suis mal pris).

Mais je pense que ca ne fonctionne pas à cause du fait que je créé un nouvel arbre et donc le TreePath est différent. (je pense).

Mais si c'est plus facile avec cette alternative, je suis pret à la prendre.

Merci, a+
Cbil
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 juin 2006 à 22:08
Salut,

en cherchant dans les bas fond du net j'étais tombé sur ça :

/**
     * Finds the path in tree as specified by the array of names. The names
     * array is a sequence of names where names[0] is the root and names[i] is a
     * child of names[i-1]. Comparison is done using String.equals().

     * example :

     *
TreePath path = tree.findByName(new String[]{"JTree", "food",
     * "bananas"});


     *
     * @param names
     *            String array names
     * @return Returns null if not found, else return the parent path
     */
    public TreePath findByName(JTree tree, String[] names) {
        TreeNode root = (TreeNode) tree.getModel().getRoot();
        return find(new TreePath(root), names, 0, true);
    }

    /**
     * Find a node
     *
     * @param parent  parent node
     * @param nodes   nodes to find
     * @param depth
     * @param byName search by name?
     * @return return the treePath or null
     */
    private TreePath find(TreePath parent, Object[] nodes, int depth, boolean byName) {
        TreeNode node = (TreeNode) parent.getLastPathComponent();
       
        Object o = node;
        if(o == null) return null;
        // If by name, convert node to a string
        if (byName)
            o = o.toString();
        // If equal, go down the branch
        if (o.equals(nodes[depth])) {
            // If at end, return match
            if (depth == nodes.length - 1)
                return parent;

            // Traverse children
            if (node.getChildCount() >= 0)
                for (Enumeration e = node.children(); e.hasMoreElements();) {
                    TreeNode n = (TreeNode) e.nextElement();
                    TreePath path = parent.pathByAddingChild(n);
                    TreePath result = find(path, nodes, depth + 1, byName);
                    // Found a match
                    if (result != null)
                        return result;
                }
        }
        // No match at this branch
        return null;
    }

donc déjà avec ça tu devrais trouver le noeud que tu cherche
apres pour étendre ton jtree sur le noeud que tu feux c'est un jeux d'enfants

admettons l'arbre donc le avec une racine JTree, un noeud  food et un fils bananas
* JTree
    * food

         - bananas

tu fais
JTree tree = ....
....
TreePath path = tree.findByName(new String[]{"JTree", "food", "bananas"});
tree.expandPath(path);

bien sur avant ta modif tu fais un tree.getSelectionPath(); pour recupérer le path courrant comme ca tu as juste besoin de remplacer la fin du path par le nouveau noeud séléctionné

WORA
cs_cbil Messages postés 140 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 15 mai 2008 1
10 juin 2006 à 00:27
Ok merci, j'essaierai ça lundi. Je savais pas que ca fonctionnais comme ça les TreePath. Merci beaucoup WORA ! Ca devrait résoudre mon problème du coup je pense.

a+ et bon week-end !
Cbil
Rejoignez-nous