IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JTREE] une info cachée dans un noeud


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 164
    Points : 71
    Points
    71
    Par défaut [JTREE] une info cachée dans un noeud
    Bonjour à tous

    Je souhaite réaliser un Tree pour l'affichage des adhérents d'un club, sachant qu'il y a parfois plusieurs membre d'une même famille (d'où l'utilisation d'un tree pour les regrouper).
    La seule donné unique est le N° de licence de l'adhérent, mais retrouver quelqu'un avec ça : 123456A ce n'est pas trés pratique.

    J'aimerai donc avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Adhérent
       |_ Dumachin
          |_ Jean <123456A>
          |_ Monique <987654Z>
    où les valeurs entre <> ne sont pas visibles mais lorsque je selectionne le noeud, retrouver cette valeur pour réaliser mes select dans mes bases.

    Comment peut-on faire ce genre de chose en Java ?

    J'ai déjà réaliser le programme en VB.NET (mais pour le portage sous Linux et Mac, walou, voilà pourquoi je ré-écrit en Java ) et la propriété du noeud et .Tag dans laquelle on peut mettre ce que l'on veut

    d'avance

    Pascal

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Un DefaultMutableNode peut contenir n'importe quel objet, pas forcément des String.


    Il te suffit donc de construire ton modèle à partir d'objets contenant ton id et la valeur que tu veux afficher, et d'écrire un renderer adapté pour n'afficher que la valeur de ton objet.
    ++
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    je me permet de compléter la réponse de sinok :

    pour faire simple plus simple tu peux utiliser un objet particulier que tu ajoutes dans ton arbre (comme dit sinok) et tu fais renvoyer par toString() de cet object ce que tu veux afficher dans ton arbre
    => tu affiches un certaine valeur dans l'arbre (par toString()) et tu accèdes au reste de l'objet depuis ton code.

    Ainsi tu évites de créer un renderer particulier.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 164
    Points : 71
    Points
    71
    Par défaut
    Merci pour vos réponses

    je ne sais pas comment on précède pour ce genre de démarche.

    Si je comprend bien (ou mal ) je créé un objet contenant par exemple 2 propriétés, une que j'affiche et l'autre non? Je le place à la place du string que je voulai afficher. C'est bien ça?

    Pascal

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Grosso merdo il te faut construire un DefaultTableModel à base de DefaultMutableNode.

    Dans ces nodes tu peux mettre n'importe que objet (par le biais du constructeur ou de la méthode setUserObject), dans ton cas un objet contenant un nom et une id, mais celà pourrait aussi bien être un objet contenant un quarantaine de propriétés, là n'est pas la question

    Ensuite tu crées ton JTree à partir de ton model (rien de bien sorcier).

    Puis tu écris un TreeCellRenderer héritant de DefaultTreeCellRenderer redéfinissant la méthode getTreeCellRendererComponent.

    Dans cette méthode le paramètre Object value correspond à un DefaultMutableTreeNode dont tu peux récupérer l'objet contenu au moyen de la méthode getUserObjet.

    Ensuite à toi de comprendre le concept de renderer, y'a plein de ressources sur le net pour çà
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 164
    Points : 71
    Points
    71
    Par défaut


    J'apprécie beaucoup vos explication ,c'est très sympa de votre part.

    Il y a juste que je ne suis pas doué
    Je suis autodidacte en Java et j'ai un peu de mal à assembler les pieces du Légo

    J'ai créé un objet IdArcher (ça vous donne un idée de ce pour quoi je travail )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class IdArcher {
          public IdArcher() {
        }
        public String Prenom;
        public String Nom;
        public String IdLicence;
     
    }
    Ensuite, j'ai essayé de suivre les indications de Sinok, mais là, je me retrouve avec plus de questions qu'au départ.
    Pour construire mon arbre(juste pour tester, ce n'est absolument pas la version finale )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void InitTreeArchers(){
            IdArcher Id = new IdArcher();
            DefaultMutableTreeNode racine = new DefaultMutableTreeNode("Archers");
            DefaultMutableTreeNode nom, prenom;
            DefaultTableModel DTM = new DefaultTableModel();
            Id.Nom = "MachinChose";
            Id.Prenom = "Raoul";
            Id.IdLicence = "123456B";
            nom = new DefaultMutableTreeNode(Id.Nom);
            racine.add(nom);
            prenom = new DefaultMutableTreeNode(Id.Prenom);
            nom.add(prenom);
             jTreeArchers.setModel(new DefaultTreeModel(racine));
         }
    Pour lire mon arbre je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void jTreeArchersValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                          
            String Valeur;
     
            Valeur = this.jTreeArchers.getLastSelectedPathComponent().toString();
             JOptionPane.showMessageDialog(null,"Valeur de la selection  : " + Valeur);
     
        }
    et là j'affiche bien le texte du noeud sélectionné.
    J'ai vu que dans le DefaultTableModel on pouvait ajouter je lignes et colonnes,etc...

    Par contre, je n'arrive pas:
    • à renseigner correctement le DefaultTableModel
    • à lier DefaultTableModel avec le node
    • et je ne vois pas comment on utilise le TreeCellRenderer


    Je sais, je suis un
    Désolé.

    Si vous aviez des bouts de code ou un exemple qui me permettrai de comprendre le procédé,je suis preneur. Parfois,ça me cause plus que des explications

    d'avance

    Pascal

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Oups grosse typo de ma part c'est un DefaultTreeModel qu'il faut utiliser, le DefaultTableModel c'est pour les JTable

    Sorry


    Sinon niveau code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    MonObjet monObject = new MonObjet("truc");
    DefaultMutableTreeNoderacine  = new DefaultMutableTreeNode(monObjet);
    //on ajoute des fils...
    racine.add(new DefaultMutableTreeNode(new MonObjet("machin")));
    // ...
    //Et ainsi de suite, on construit l'arborescence
    // ...
     
    //Creation du moel
    DefaultTreeModel model = new DefaultTreeModel(racine);
    //Creation du JTree
     
    JTree myTree = new JTree(model);
     
    //application du renderer
     
    myTree.setCellRenderer (new MyCellRenderer());


    Pour le renderer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class MyRenderer extends DefaultTreeCellRenderer {
     
        /* (non-Javadoc)
         * @see javax.swing.tree.DefaultTreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
         */
        @Override
        public Component getTreeCellRendererComponent(JTree arg0, Object arg1,
                boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) {
            if( arg1 instanceof MonObjet) {
                this.setText(((MonObjet)arg1).getName());
                return this;
            } else  {
                return super.getTreeCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
            }
     
        }
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 164
    Points : 71
    Points
    71
    Par défaut


    Je teste ça dès que possible (j'ai autre chose sur le grille )

    Il faut que je me familliarise avec les Renderer, mais je pense que ça peut ouvrir pas mal d'horizons

    C'est un réel plaisir de naviguer sur ce forum, sincèrement, il y a toujours quelqu'un pour aider les novices sans les prendre de haut.

    Afin de ne pas poser toujours les mêmes questions , connaissez vous un bon book sur le Swing et sur Java, abordable pas des débutants mais suffisament riche pour avancer



    Pascal

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. Ajouter des infos cachées dans une image
    Par rambc dans le forum Général Python
    Réponses: 6
    Dernier message: 24/06/2009, 17h48
  2. Une erreur cachée, dans le POST
    Par bigltnt dans le forum Langage
    Réponses: 7
    Dernier message: 26/06/2007, 17h36
  3. Réponses: 2
    Dernier message: 08/12/2006, 11h09
  4. Afficher une info bulle dans un composant AWT
    Par Marius_94 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 13/07/2006, 09h56
  5. [MySQL] ecrire dans une table une info présente dans un formulaire.
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 29/03/2006, 00h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo