Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1122 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Gerer les couleurs des branches d'un arbre suivant le focus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gerer les couleurs des branches d'un arbre suivant le focus

n°929358
sgamier
Posté le 21-12-2004 à 17:05:11  profilanswer
 

Bonjour a tous ...
 
J'ai un Jtree auquel j'ai besoin de faire
setCellRenderer(un DefaultTreeCellRenderer )
addFocusListener(un FocusListener )
et addTreeSelectionListener(un TreeSelectionListener)
 
pour cela j'ai fait une classe
 
 

Code :
  1. public class MonCellRenderer extends DefaultTreeCellRenderer implements FocusListener ,TreeSelectionListener{
  2.   public Component getTreeCellRendererComponent(JTree tree,
  3.                                                  Object value,
  4.                                                  boolean sel,
  5.                                                  boolean expanded,
  6.                                                  boolean leaf,
  7.                                                  int row,
  8.                                                  boolean hasFocus){
  9.     if (sel)
  10.       {
  11.          switch (etat.getMessageLevel())
  12.          {
  13.             case GenEtat.NIVEAU_CHANGED:
  14.                setForeground(COLOR_CHANGED_S);
  15.                break;
  16.             case GenEtat.NIVEAU_ERROR:
  17.                setForeground(COLOR_ERROR_S);
  18.                break;
  19.             case GenEtat.NIVEAU_WARNING:
  20.                setForeground(COLOR_WARNING_S);
  21.                break;
  22.             case GenEtat.NIVEAU_FILS:
  23.                setForeground(COLOR_FILS_S);
  24.                break;
  25.             case GenEtat.NIVEAU_NO_ERROR:
  26.             default:
  27.                setForeground(getTextSelectionColor());
  28.                break;
  29.          }
  30.       }
  31.   }
  32.    public void valueChanged(TreeSelectionEvent e){
  33.      chgColor(true);
  34.    }
  35.    public void focusGained(FocusEvent  e){
  36.      chgColor(false);
  37.    }
  38.    public void focusLost(FocusEvent  e){
  39.      chgColor(true);
  40.    }
  41.    private void chgColor(boolean pInverse){
  42.      Color foreGround = getForeground();
  43.      Color backGround = getBackground();
  44.      if(foreGround!=null && backGround!=null){
  45.        Color newForeGroundColor = getTextSelectionColor();
  46.        Color newBackGroundColor = getBackgroundSelectionColor();
  47.        //Couleur inverse
  48.        if (pInverse) {
  49.          System.out.println("couleur inverse" );
  50.          this.setOpaque(true);
  51.          newForeGroundColor = Color.orange; //foreGround.brighter();
  52.          newBackGroundColor = Color.black; //backGround.darker();
  53.        }
  54.        setForeground(newForeGroundColor);
  55.        setBackground(newBackGroundColor);
  56.      }
  57.      this.repaint();
  58.    }
  59. }


 
 
Le défaut est que le getTreeCellRendererComponent passe APRES focusGained, focusLost et valueChanged.
 
Ce qui fait que mon code ne sert a rien !
Puisque les couleurs sont écrasé par celles de getTreeCellRendererComponent   :fou:  
 
 
Le but est le suivant :
-mon arbre gere des panneaux qui sont visible ou invisible suivant la feuille de l'arbre choisie.
-Lorsque l'on selectionne les feuilles elles ont une couleur différente.
-si l'on modifie qq chose dans le panneau associé le texte de l'arbre change de couleur
-et si le focus n'est plus sur l'arbre mais DANS le panneau, je veux qu'il soit coloré autrement. C'est ce dernier point qui ne fonctionne pas.
Actuellement la feuille de l'arbre est bleu lors de sa selection, et si je me deplace (donc je perd le focus sur l'arbre) il reste bleu. Moi je veux qu'il devienne d'une autre couleur.. par exemple orange. Et que lorsque je revienne dessus...il revienne bleu...
 
je m'arrache la tete avec ca c'est extraordinaire .. alors que cela ne semble pas sorcier... !!!
 
Au passage signalons que j'ai surchargé JTree pour lui ajouté cela
 

Code :
  1. addKeyListener(
  2.                new KeyAdapter()
  3.                {
  4.                   public void keyPressed(KeyEvent e)
  5.                   {
  6.                     if (e.getKeyCode() == KeyEvent.VK_SPACE)
  7.                     {
  8.                        if ((e.getModifiers() & KeyEvent.ALT_MASK) == 0 && (e.getModifiers() & KeyEvent.CTRL_MASK) == 0
  9.                                 && (e.getModifiers() & KeyEvent.SHIFT_MASK) == 0)
  10.                        {
  11.                           //selectionne le panneau
  12.                           if(selectCurrentNode()){
  13.                             //consume l'evenement si selection ok afin de garder le focus sur la feuille
  14.                             e.consume();
  15.                           }
  16.                        }
  17.                     }
  18.                   }
  19.                });


 
 
Merci a ceux qui ont des idées ...
je sens que je vais devenir  :pt1cable: sinon !

mood
Publicité
Posté le 21-12-2004 à 17:05:11  profilanswer
 

n°929637
veryfree
Posté le 22-12-2004 à 00:07:39  profilanswer
 

pourquoi t'utilise pas tout simplement le:
 
# getTreeCellRendererComponent(JTree tree,
#                                                  Object value,
#                                                  boolean sel,
#                                                  boolean expanded,
#                                                  boolean leaf,
#                                                  int row,
#                                                  boolean hasFocus){
 
au lieu de mettre un listener  :??:


Message édité par veryfree le 22-12-2004 à 00:08:13
n°929904
sgamier
Posté le 22-12-2004 à 12:02:28  profilanswer
 

Merci mais je suis obligé de mettre un listener... essaye tu verra le hasFocus ne fait vraiment ce à quoi tu penses !
 
En effet, lorsque l'on se déplace dans le jTree, par exemple vers le haut, la méthode getTreeCellRendererComponent est utilisé 2 fois
- une fois pour le noeud on l'on vient d'accéder (hasFocus = true)
- une fois pour le noeud on l'on vient d'arriver (hasFocus = false)
 
de plus si l'on descend, l'ordre est inversé, cela devient :
- une fois pour le noeud on l'on vient d'arriver (hasFocus = false)
- une fois pour le noeud on l'on vient d'accéder (hasFocus = true)
 
Mon erreur etait toute simple...
ce n'est pas dans les méthodes focusGained et focusLost qu'il faut mettre à jour les couleurs (puisque celle ci vont être écrasées), mais dans ces méthodes il faut simplement mettre à jour les variables qui vont être utilisées par le getTreeCellRendererComponent .
 
Compris ? :whistle:  
 
Apres avoir donc galérer un bon gros moment je vous donne ici la solution que j'ai retenue... et qui est bien évidemment super simple quand on la (la solution)  ;)  
 
 

Code :
  1. public class MonCellRenderer extends DefaultTreeCellRenderer implements FocusListener ,TreeSelectionListener{
  2.    public final static   Color COLOR_CHANGED_NS = Color.blue;
  3.    public final static   Color COLOR_CHANGED_S  = Color.blue;
  4.    public final static   Color COLOR_ERROR_NS   = Color.red;
  5.    public final static   Color COLOR_ERROR_S    = Color.red;
  6.    public final static   Color COLOR_FILS_NS    = Color.magenta;
  7.    public final static   Color COLOR_FILS_S     = Color.magenta;
  8.    public final static   Color COLOR_WARNING_NS = new Color(255,135,17);
  9.    public final static   Color COLOR_WARNING_S  = new Color(255,135,17);
  10.    public Color      _colorChangedNS               = COLOR_CHANGED_NS;
  11.    public Color      _colorChangedS                = COLOR_CHANGED_S;
  12.    public Color      _colorErrorNS                 = COLOR_ERROR_NS;
  13.    public Color      _colorErrorS                  = COLOR_ERROR_S;
  14.    public Color      _colorFilsNS                  = COLOR_FILS_NS;
  15.    public Color      _colorFilsS                   = COLOR_FILS_S;
  16.    public Color      _colorWarningNS               = COLOR_WARNING_NS;
  17.    public Color      _colorWarningS                = COLOR_WARNING_S;
  18.   public Component getTreeCellRendererComponent(JTree tree,
  19.                                                  Object value,
  20.                                                  boolean sel,
  21.                                                  boolean expanded,
  22.                                                  boolean leaf,
  23.                                                  int row,
  24.                                                  boolean hasFocus){
  25.     if (sel)
  26.       {
  27.          switch (etat.getMessageLevel())
  28.          {
  29.             case GenEtat.NIVEAU_CHANGED:
  30.                setForeground(COLOR_CHANGED_S);
  31.                break;
  32.             case GenEtat.NIVEAU_ERROR:
  33.                setForeground(COLOR_ERROR_S);
  34.                break;
  35.             case GenEtat.NIVEAU_WARNING:
  36.                setForeground(COLOR_WARNING_S);
  37.                break;
  38.             case GenEtat.NIVEAU_FILS:
  39.                setForeground(COLOR_FILS_S);
  40.                break;
  41.             case GenEtat.NIVEAU_NO_ERROR:
  42.             default:
  43.                setForeground(getTextSelectionColor());
  44.                break;
  45.          }
  46.       }
  47.       //remise en place des couleurs par défaut
  48.       changeColor(false);
  49.   }
  50.    /**
  51.     * surcharge pour l'implementation du FocusListener
  52.     * change les couleurs qui vont etre utilisées par le getTreeCellRendererComponent
  53.     * @author sgamier
  54.     * @version 20041222
  55.     * @param e L'evenement recu
  56.     */
  57.    public void focusGained(FocusEvent  e){
  58.      changeColor(false);
  59.    }
  60.    /**
  61.     * surcharge pour l'implementation du FocusListener
  62.     * Rétabli les couleurs par défaut, qui vont etre utilisées par le getTreeCellRendererComponent
  63.     * @author sgamier
  64.     * @version 20041222
  65.     * @param e L'evenement recu
  66.     */
  67.    public void focusLost(FocusEvent  e){
  68.      changeColor(true);
  69.   }
  70.   /**
  71.    * Mise a jour des couleurs utilisées par le
  72.    * getTreeCellRendererComponent
  73.    * @author sgamier
  74.    * @version 20041222
  75.    * @param pReverseColor booleen a true s'il faut
  76.    * changer les couleurs, a false sinon
  77.    */
  78.    private void changeColor(boolean pReverseColor){
  79.      if(pReverseColor){
  80.        Color reverseColor = Color.orange;
  81.        this.setTextSelectionColor     (reverseColor);
  82.        this.setTextNonSelectionColor  (reverseColor);
  83.        _colorChangedNS               = reverseColor;
  84.        _colorChangedS                = reverseColor;
  85.        _colorErrorNS                 = reverseColor;
  86.        _colorErrorS                  = reverseColor;
  87.        _colorFilsNS                  = reverseColor;
  88.        _colorFilsS                   = reverseColor;
  89.        _colorWarningNS               = reverseColor;
  90.        _colorWarningS                = reverseColor;
  91.      }else{
  92.        this.setTextSelectionColor(UIManager.getColor("Tree.selectionForeground" ));
  93.        this.setTextNonSelectionColor(UIManager.getColor("Tree.textForeground" ));
  94.        _colorChangedNS = COLOR_CHANGED_NS;
  95.        _colorChangedS = COLOR_CHANGED_S;
  96.        _colorErrorNS = COLOR_ERROR_NS;
  97.        _colorErrorS = COLOR_ERROR_S;
  98.        _colorFilsNS = COLOR_FILS_NS;
  99.        _colorFilsS = COLOR_FILS_S;
  100.        _colorWarningNS = COLOR_WARNING_NS;
  101.        _colorWarningS = COLOR_WARNING_S;
  102.      }
  103.    }


 
 
Voila....
 
J'espère que cela sera utile à d'autres.
 
Sébastien

n°930300
the real m​oins moins
Posté le 22-12-2004 à 19:38:10  profilanswer
 

pas mal :)
 
pour toutes tes constantes/couleurs, tu aurais sans doute avantage à les remplacer par une map, ne fut-ce que pour la concision.
 
et je suis pas sur d'avoir capté l'utilité de tes membres _color* !?
(y'a une raison au fait qu'ils soient publics? meme question pour les constantes...)


Message édité par the real moins moins le 22-12-2004 à 19:40:06

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°930525
sgamier
Posté le 22-12-2004 à 22:16:58  profilanswer
 

Effectivement une jolie map ca peut le faire :-)
 
Par contre il est vrai qu'il n'y a aucun intérêt à ce que les membres soient publics.
 
C'est une bête erreur   :p  
 
Pour ce qui est de l'utilité des membres _color* c'est uniquement une question
d'historique de la classe.
 
De toute facon, il y a forcément moyen de faire plus jolie...  ;)  
 
 
Sébastien

n°930545
nraynaud
lol
Posté le 22-12-2004 à 22:42:20  profilanswer
 

nan, le principe est bon, effectivement, le renderer par défaut est un Component, qui gère des évènements comme les autres.
 
C'est d'ailleur un composant qui se déplace avec le curseur de la souris lui aussi (mais ça se voit pas).


---------------
trainoo.com, c'est fini

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Gerer les couleurs des branches d'un arbre suivant le focus

 

Sujets relatifs
[resolu] focus sur JFrametri d'un tableau d'objet suivant une relation d'ordre
[ASPX][C#] Gérer des données sur une page, gestion des eventAppli intranet: gerer les droits et users
Couleurs ascenceur d'une balise overflowGerer la redirection selon que le javascript est active ou pas
comment recuperer les couleurs d'un pixel dans une image?Arbre, calcul du nombre de "coup" pour une recherche
Arbre de rechercheGérer les sessions sans cookies ????
Plus de sujets relatifs à : Gerer les couleurs des branches d'un arbre suivant le focus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR