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

cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention - 24 mai 2006 à 14:53 - Dernière réponse : cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention
- 8 juin 2006 à 10:47
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
Afficher la suite 

Votre réponse

8 réponses

uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 25 mai 2006 à 07:15
+3
Utile
//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;
        }
    }
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de uhrand
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 8 juin 2006 à 06:36
+3
Utile
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?)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de uhrand
cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention - 8 juin 2006 à 10:47
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_cbil
cs_makni 15 Messages postés mercredi 20 juillet 2005Date d'inscription 31 mai 2006 Dernière intervention - 24 mai 2006 à 23:47
0
Utile
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
Commenter la réponse de cs_makni
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 25 mai 2006 à 06:55
0
Utile
 




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);
            }
        }
    }
Commenter la réponse de uhrand
cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention - 25 mai 2006 à 08:47
0
Utile
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
Commenter la réponse de cs_cbil
cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention - 7 juin 2006 à 16:59
0
Utile
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
Commenter la réponse de cs_cbil
cs_cbil 140 Messages postés mercredi 30 avril 2003Date d'inscription 15 mai 2008 Dernière intervention - 8 juin 2006 à 10:36
0
Utile
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
Commenter la réponse de cs_cbil

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.