[JTree] mettre un tooltip sur un noeud ? (sur DefaultMutableTreeNode ?) [Résolu]

Signaler
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
-
cs_cbil
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
-
Bonjour tout le monde !

J'ai quelques petits soucis avec les JTree, c'est la premiere que je m'en sers. J'ai creer un arbre JTree avec une serie de noeud et sous-noeud de type DefaultMutableTreeNode. Je souhaiterez mettre un tooltip sur chaque noeud mais aucune methode n'existe avec la classe DefaultMutableTreeNode. Comment faire ? Y a t-il une alternative au lieu d'utiliser DefaultMutableTreeNode ?

Merci all !
a+
Cbil
A voir également:

8 réponses

Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
//Where the tree is initialized:
        //Enable tooltips:
        ToolTipManager.sharedInstance().registerComponent(tree);
        tree.setCellRenderer(new MyRenderer());


...
    class MyRenderer extends DefaultTreeCellRenderer {
        public Component getTreeCellRendererComponent(
                JTree tree,
                Object value,
                boolean sel,
                boolean expanded,
                boolean leaf,
                int row,
                boolean hasFocus) {
            super.getTreeCellRendererComponent(
                    tree, value, sel,
                    expanded, leaf, row,
                    hasFocus);
            if (leaf) {
                setToolTipText("This is a leaf.");
            } else {
                setToolTipText(null); //no tool tip
            }
            return this;
        }
    }
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
Bonjour cbil.


Je suis désolé de la confusion que j'ai causé. En fait, la réponse concernant le addNode est destiné à makni qui évoquait ce problème dans sa réponse à lui (voir plus haut).
Ce que tu dois faire c'est indiqué dans la réponse concernant le ToolTipManager:
1. enregistrer le JTree auprès du ToolTipManager.
2. enregistrer MyRenderer auprès du JTree
3. adapter la logique de MyRenderer à tes besoins (ici tu as peut-être des problèmes?)
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
1
Cool merci, c'est bien Value mon objet NoeudArbreXML :

Mes test provoquer une erreur car l'objet n'etait sans doute pas toujours un NoeudArbreXML.

Pour verifier si value etait bien mon objet NoeudArbreXML, j'ai fais ca : 

setToolTipText(value.getClass().getName());

Sinon pour getTreeCellRendererComponent, si on ajoute un parametre comme mon string tooltip, ca marche plus apres.
Enfin voila, ca marche nickel maintenant merci beaucoup uhrand

Voici mon renderer final :

private class MyRenderer extends DefaultTreeCellRenderer {
        public Component getTreeCellRendererComponent(
                JTree tree,
                Object value,
                boolean sel,
                boolean expanded,
                boolean leaf,
                int row,
                boolean hasFocus) {
            super.getTreeCellRendererComponent(
                    tree, value, sel,
                    expanded, leaf, row,
                    hasFocus);
           if(value.getClass().equals(NoeudArbreXML.class)) //Pour verifier si c'est bien la classe concernée
                    setToolTipText(((NoeudArbreXML) value).getToolTipNoeud());
            return this;
        }
    }

a+
Cbil
Messages postés
15
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
31 mai 2006

Salut regarde est ce k'il ya setTooltipText sur defaultMutableTreeNode, je v t'envoyer une adresse d'un site que tu trouvera solution a ton probleme que je n'ai pas en ce moment , mais je vous prie de m'aider , g une Jtree qui affiche les fichiers d'un dossier et je ve qd j'ajoute un autre fichier le Jtree affiche le noeud du nouveau fichier , g  essayé et j'ai pas trouvé sachant que je travaille avec defaultMutableTreeNode.
Merci
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
 




Cette méthode ajoute un nouveau Node
en dessous du Node sélectionné:


    private void addNode(){
        TreePath selectedPath = tree.getSelectionPath();
        if(selectedPath != null){
            Object o = selectedPath.getLastPathComponent();
            if(o != null){
                DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) o;
                DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("new node ");
                ((DefaultTreeModel)tree.getModel())
                .insertNodeInto(newChild, selectedNode, selectedNode.getChildCount());
                TreePath newPath = selectedPath.pathByAddingChild(newChild);
                tree.setSelectionPath(newPath);
                tree.startEditingAtPath(newPath);
            }
        }
    }
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
1
Merci beaucoup !

J'essayerais tout ca lundi

(makni : il n'y a pas de setTooltipText sur defaultMutableTreeNode, c'est pour ca que je galerais  )

a+
Cbil
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
1
Bonjour Uhrand, j'avais essayé mais pas reussi et laisser tomber pour le moment. Mais à présent, j'en ai besoin (des tooltip) pour un autre arbre de mon programme.

Je ne comprend pas comment utiliser le code que chaque noeud ou feuille est son propre tooltip vu que c un JTree qui est utilisé. Je ne comprend pas non plus le rapport entre Tooltip et addNode ? (addNode n'est pas utilisé)

Merci beaucoup, a+
Cbil
Messages postés
140
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
15 mai 2008
1
Bonjour,
C'est moi qui suis désolé, j'ai mal relu l'ensemble.

J'ai un peu pres compris l'ensemble du code, le tooltip fonctionne. Mais je n'arrive pas à personnaliser le tooltip en fonction du noeud.

D'apres ce que j'ai compris, le MyRenderer (ou plutot la methode get...)est appelé à chaque ajout d'un noeud. - Est-il possible et comment d'acceder au noeud ou l'objet de ce noeud pour connaitre le tooltip ?
- Ou alors, en mettant un nouveau parametre String tooltip puis setTooltip dans la methode, est-il possible de preciser la valeur du parametre et à quel moment ?
- Qu'est ce que le parametre Object value, le noeud en cours ? j'ai essayé avec une concatenation de DefaultMutableTreeNode ou NoeudArbreXML mais ca ne marche pas, erreur d'execution.

(car je ne vois pas ou sont entré ces parametres, tout se fait automatiquement à l'appel de la methode on dirait,).

Dans mon programme, un noeud est sous la forme d'un objet d'une classe avec extends extends DefaultMutableTreeNode :

public class NoeudArbreXML extends DefaultMutableTreeNode
{


 private Element noeud = null;
 private String[][] attributs = null;
 private String toolTip;
  
 public NoeudArbreXML(Element telNoeud, String telNom, String telToolTip)
 {
  super(telNom);
  noeud = telNoeud;
  toolTip = telToolTip;
  initialisation();
 }
 
//cette methode pour recuperer le tooltip pour MyRenderer
 public String getToolTipNoeud()
 {
  return toolTip;
 }
 
 
 public void initialisation()
 {
  List lesNoeuds = noeud.getAttributes();
  
  attributs = new String[lesNoeuds.size()][2];
  
  for(int i=0;i<lesNoeuds.size();i++)
  {
   attributs[i][0]=((Attribute) (lesNoeuds.get(i))).getName();
   attributs[i][1]=((Attribute) (lesNoeuds.get(i))).getValue();
  }
 }
 
 public int getNombreAttributs()
 {
  return noeud.getAttributes().size();
 }

 
}

Enfin mon MyRenderer :

private class MyRenderer extends DefaultTreeCellRenderer {
        public Component getTreeCellRendererComponent(
                JTree tree,
                Object value,
                boolean sel,
                boolean expanded,
                boolean leaf,
                int row,
                boolean hasFocus, String tooltip) {
            super.getTreeCellRendererComponent(
                    tree, value, sel,
                    expanded, leaf, row,
                    hasFocus);
          
            setToolTipText(tooltip);
(ou setToolTipText( l'objet de la classe NoeudArbreXML avec acces à la methode getToolTipNoeud() ) )
            return this;
        }
    }

Pour la creation de mon arbre, j'ai une methode creationArbre() qui créé le JTree (c'est ici que j'ai mis les fonction du renderer et tooltipmanager), une fois l'instance du JTree créé, une seconde methode unArbre est appelé pour qui créé chaque noeud NoeudArbreXML selon l'arborescence voulu, elle renvoie le noeud principal. 

public JTree creationArbre(String affichage)
 {
   
  JTree monArbre = new JTree();
  ToolTipManager.sharedInstance().registerComponent(monArbre);
  MyRenderer rendu = new MyRenderer(); //c'etait au cas ou j'ai besoin de l'instance rendu apres sinon un new .... suffisait en parametre
  monArbre.setCellRenderer(rendu);
  NoeudArbreXML tn = unArbre(traitement.getRacine(), affichage); //tn le NoeudArbreXML racine
  monArbre.setModel (new DefaultTreeModel(tn));
  monArbre.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
  monArbre.addTreeSelectionListener(this);
  
  return monArbre;
 }

   Merci beaucoup !
J'espere que ce que j'ai ecrit n'est pas trop galere à comprendre ^^

Cbil