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 :

Couleur d'un noeud en fonction de son nom


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Par défaut Couleur d'un noeud en fonction de son nom
    Bonjour,

    J'essaie actuellement de colorer uniquement certains noeuds qui ont une valeur spécifique, à savoir une adresse ip. Le problème c'est que je n'arrive pas à trouver la bonne condition pour qu'uniquement ces noeuds soient colorer et non pas tous.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    class MyRenderer extends DefaultTreeCellRenderer {
     
            public MyRenderer() {
            }
     
            @Override
            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);
     
                Pattern pattern;
                Matcher matcher;
                pattern = Pattern.compile("^([0-9]{1,3}\\.){3}[0-9]{1,3}$"); //regex ip address ([0-9]{1,3}\\.){3}[0-9]{1,3}
                matcher = pattern.matcher(value.toString());
                if (matcher.find()) {
                    System.out.println("OK");
                    setBackground(Color.green);
                }
                System.out.println("SORTIE");
     
                return this;
            }
        }
    J'ai compris que dès qu'il y avait une opération sur l'arbre, cette classe est "appelée"/"utilisée", et qu'apparemment elle parcours l'arbre donc je ne peux pas me fier à la variable "value" car elle aura plusieurs valeurs.

    Si quelqu'un à une idée je serai preneur

    Merci d'avance !

    Riri

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Par défaut
    Bonjour,

    J'ai trouvé une pseudo réponse mais je ne comprend pas trop comment elle fonctionne :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    class MyRenderer extends DefaultTreeCellRenderer {
     
            public MyRenderer() {
            }
     
            @Override
            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);
     
                DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)value;
                Pattern pattern;
                Matcher matcher;
                pattern = Pattern.compile("([0-9]{1,3}\\.){3}[0-9]{1,3}"); //regex ip address ([0-9]{1,3}\\.){3}[0-9]{1,3}
                matcher = pattern.matcher(dmtn.getUserObject().toString());
                if (matcher.find()) {
                    setColorParentGreen(dmtn);
                }
                return this;
            }
     
            private void setColorParentGreen(DefaultMutableTreeNode pm_dmtnNode) {
                if (pm_dmtnNode == null) {
                    return;
                }
     
                String s = pm_dmtnNode.getUserObject().toString();
                JLabel l = new JLabel(s);
                pm_dmtnNode.setUserObject(l);
                this.setForeground(Color.green);
            }
        }
    Donc effectivement si une adresse ip est détectée (mais je ne comprend pas trop ou/comment/pourquoi) alors ma fonction pour colorer le noeud est appelée, mais ensuite impossible de comprendre comment le noeud contenant ma regex est choisis (ça colore bien celui-ci, mais je ne comprend pas comment).

    Si quelqu'un pouvais m'expliquer...

    Merci d'avance,

    Riri

  3. #3
    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
    Si j'ai bien compris, la fonction getTreeCellRendererComponent() est appelée pour chaque élément de l'arbre affiché à l'écran (donc seulement ceux que l'on voit, pas ceux cachés par le scrollPane, etc...) et retourne l'objet graphique à afficher (en général et par défaut un JLabel() ).

    Donc pour chaque élément visible, il y a moyen de récupérer le noeud en question (la "value"), et des caractéristiques tel que le fait qu'il soit sélectionné ou non, etc...

    Donc là je ne vois pas où est le problème, ta fonction est appelée pour chaque noeud, tu test à ce moment si l'élément est une adresse IP, et si c'est le cas tu set la couleur du Component qui va être retourné, ce qui l'affichera en vert... pour tous les autres, la couleur par défaut sera conservée...


    C'est plus clair ou ce n'est pas l'explication que tu attendais?


    Par contre, j'ai un peu de mal à comprendre le but de la fonction setColorParentGreen(..). Un simple this.setForeGround(Color.green) au niveau du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (matcher.find()) {
           setColorParentGreen(dmtn);
    }
    aurait suffit pour colorer ton texte (C'est ce que j'ai fait dans le programme que je développe actuellement).

Discussions similaires

  1. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  2. récupérer indice champ en fonction de son nom
    Par chris76 dans le forum Access
    Réponses: 2
    Dernier message: 05/01/2007, 08h31
  3. [VB6] Connaitre la lettre d'un lecteur en fonction de son nom
    Par dbozec dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/11/2006, 21h57
  4. cocher une checkbox en fonction de son nom
    Par boss_gama dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/09/2006, 16h42
  5. appeler une fonction connaissant son nom (en string)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2004, 00h46

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