cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 mai 2008
-
9 juin 2006 à 12:25
cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 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.
cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 mai 20081 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 '...' )
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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
cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 mai 20081 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 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 :
-----------------------------------
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)
cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 mai 20081 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.
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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().
*
* @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é
cs_cbil
Messages postés140Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention15 mai 20081 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.