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

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

Marsh Posté le 21-12-2004 à 17:05:11    

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 !

Reply

Marsh Posté le 21-12-2004 à 17:05:11   

Reply

Marsh Posté le 22-12-2004 à 00:07:39    

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
Reply

Marsh Posté le 22-12-2004 à 12:02:28    

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

Reply

Marsh Posté le 22-12-2004 à 19:38:10    

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 ?
Reply

Marsh Posté le 22-12-2004 à 22:16:58    

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

Reply

Marsh Posté le 22-12-2004 à 22:42:20    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed