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 :

Sélection arborescence par paramètre


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut Sélection arborescence par paramètre
    Bonjour,

    Je viens de dessiner mon arbre et jusque là, tout va bien.

    Par contre, je voudrais colorer (en rouge par exemple) l'arborescence jusqu'à la racine selon un nom de branche donnée en paramètre.
    Mais je ne vois pas comment faire. Apparemment, il y a la fonction : getSelectionPath mais je ne vois pas comment l'utiliser en lui donnant un nom de branche...


    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 966
    Par défaut
    Si, mais vous êtes trop vague et trop pressé. Qu'avez vous essayé exactement?

    Où alors vous ne savez pas par où commencer? Si c'est le cas, voici de la lecture :
    http://download.oracle.com/javase/tu...ents/tree.html
    Il faut regarder du coté des Renderer. Bon courage!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Bonjour,

    En fait, j'ai déjà fait mon arbre :
    -arbre
    ----toto
    ----toto1
    --------fils1
    --------fils2
    ----toto2

    Je voudrais créer une fonction avec en paramètre le nom d'une branche, qui va me colorer ma branche mais aussi toute l'arborescence jusqu'à la racine.
    Ex : mafct_color(fils1);
    -arbre
    ----toto
    ----toto1
    --------fils1
    --------fils2
    ----toto2

    Seulement, je ne vois pas comment/quelle fonction utiliser en lui mettant mon paramètre.
    J'ai regardé les docs mais je ne compreds toujours pas :-/

    Merci d'avance

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Bon, j'ai peut être une piste : avec les enumerations.

    Sauf que je n'arrive pas à comparer avec une valeur en dur.

    Ma valeur "1479" existe bien dans mon arbre mais lors de la comparaison ca ne veut pas...

    Voici mon 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
    String test1 = "1479";
        		Enumeration e=racine.breadthFirstEnumeration();
        		while(e.hasMoreElements())
        		{
        			DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
        			System.out.println(node.toString());//j'affiche bien tout meme le 1479
        			/*Avec ce code j'ai une erreur sur la valeur null
        			* if(node.getUserObject().toString().equals(test1))
                            */
                             if(node.toString()==test1)
        			{
        				System.out.println("kool "+node);
        			}
        			else System.out.println(node);
        		}
    Ca doit venir du typage Object mais je ne voit pas comment corriger :/

    Merci d'avance

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Essaye plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test1.equals(node.getUserObject().toString())
    dans ton if commenté.
    Bon, ça déconnera toujours sur le null si test1 n'est pas initialisé de manière sûre et certaine, mais ça devrait te prémunir contre les null dans ton arbre.

    Accessoirement, si ça déconne, c'est parce qu'en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    node.toString()==test1
    tu tests les référence des objets, pas les contenus.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Merci de ta réponse.

    J'ai essayé ce que tu m'as conseillé mais ca déconne sur un null.

    Bon, ça déconnera toujours sur le null si test1 n'est pas initialisé de manière sûre et certaine, mais ça devrait te prémunir contre les null dans ton arbre.
    Normalement avec mon : test1 est bien initialisé est différent de 0 ?

    Je pense plutôt que le null est dans l'arbre...
    Comment gérer ce null ?

    Merci de ton aide.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Bon, j'ai bien rajouter mon test sur la nullité de mon arbre et à présent la condition fonctionne.
    Par contre, son action (colorer le noeud et son arborescence) ne marche pas.

    J'ai fais ceci :
    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
    String test1 = "1326";
     
        		//System.out.println(FindUserObject(test));
        		Enumeration e=racine.breadthFirstEnumeration();
        		while(e.hasMoreElements())
        		{
        			DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
     
        			if((node.toString()!=null)&& (node.getUserObject().toString().contains(test1)))
        			{
        				renderer.setTextSelectionColor(Color.RED);
        	            renderer.setTextNonSelectionColor(Color.RED);
        			}
        			else{
        				renderer.setTextSelectionColor(Color.BLUE);
        	            renderer.setTextNonSelectionColor(Color.BLUE);
        			}
        		}
    Soit ca me colore tous en bleu ou tout en rouge mais pas ce que je veux.

    J'ai lu dans une doc, un exemple de coloration avec cette fonction :
    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
    19
    20
    21
    22
    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 && isTutorialBook(value)) {
                setIcon(tutorialIcon);
                setToolTipText("This book is in the Tutorial series.");
            } else {
                setToolTipText(null); //no tool tip
            } 
     
            return this;
        }
    Sauf que j'ai cette erreur lorsque je veux l'utiliser :
    The method getTreeCellRendererComponent(JTree, Object, boolean, boolean, boolean, int, boolean) is undefined for the type JFrame
    Comment puis-je faire svp?

    Merci d'avance.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Par défaut
    la seule méthode que je connaisse qui permet de modifier l'affichage d'un noeud suivant le contexte, c'est la redéfinition de la méthode getTreeCellRendererComponent() de l'arbre.

    Donc il faut que tu crées ta propre classe TreeCellRenderer, qui dérive de DefaultTreeCellRenderer et placer dans la fonction en question la condition de comparaison et le traitement à effectuer.

    Donc dans ton cas ça donnera un truc du genre :

    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
    19
    20
    21
    22
    23
    24
     
    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);
     
            //Pour ne plus avoir de problème avec des valeurs nulles
            if(value==null) return; 
     
            if(/*ta condition, à toi de voir comment gérer ça*/){
     
                  this.setForeground(/*ta couleur*/);
            }
            return this;
        }
    Mais le gros problème que tu va avoir, c'est de trouver une condition qui englobera le noeud et tous ses parents...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Oui, c'est bien ca mon problème.
    Je ne vois comment englober tous mes nœuds...
    Déjà que je n'arrive même pas a change de couleur juste pour un...

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Par défaut
    Alors il y a plusieurs solutions.


    L'une des solutions, ce serait de rajouter un membre à ton TreeCellRenderer, un TreeNode (avec les accesseurs associés), qui contiendrait le noeud en question (celui qui doit être coloré, ainsi que ses parents).
    Ensuite, tu utilises dans le TreeCellRenderer une comparaison dans le style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    tempNode = nodeToColor;
    while(!tempNode.isRoot()){
           if (tempNode.equal(value)){
                 this.setForeground(Color.red);
                 return;
           {
           tempNode = tempNode.getParent();
    {
    Il doit y avoir de faire un peu moins lourd (par exemple en stockant non seulement le noeud de base à colorer, mais aussi tous ses parents, plutot que de les calculer à chaque fois...), mais bon ceci devrait marcher

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 8
    Par défaut
    Bonjour,

    En lisant ton problème et s'il n'est toujours pas résolu.

    Personnellement, j'agirais en deux ou trois temps :

    - je ferais une fonction de calcul qui marque les noeuds qu'il faut, (un paramètre dans le noeud) que j'effectuerais avant l'affichage.

    - je modifierais le renderer en verifiant la marque et en mettant la bonne couleur (utilisation probable de instanceof)

    (- s'il faut changer le noeud voulu, on reinitialise les marques et on reutilise la fonction de calcul et un reload du modele de l'arbre.)


    En espérant que cela aide quelqu'un...

    ps: si cette technique n'est pas correcte niveau conception, merci de me l'indiquer (j'ai pas trouvé mieux pour le moment dans mon projet)

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/06/2009, 15h51
  2. passage par paramètre d'un tableau dynamique bidimensionnel
    Par shaftJackson dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/07/2006, 14h28
  3. Requête de sélection : Passage de paramètre ...
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 28/03/2006, 11h58
  4. Requête sélection : recherche par nom
    Par leeloo77 dans le forum Access
    Réponses: 7
    Dernier message: 17/02/2006, 16h39
  5. Sélection valeur par défaut dans une zone de liste
    Par Cécile154 dans le forum IHM
    Réponses: 2
    Dernier message: 15/02/2005, 19h20

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