sgamier | 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 ? 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 :
- public class MonCellRenderer extends DefaultTreeCellRenderer implements FocusListener ,TreeSelectionListener{
- public final static Color COLOR_CHANGED_NS = Color.blue;
- public final static Color COLOR_CHANGED_S = Color.blue;
- public final static Color COLOR_ERROR_NS = Color.red;
- public final static Color COLOR_ERROR_S = Color.red;
- public final static Color COLOR_FILS_NS = Color.magenta;
- public final static Color COLOR_FILS_S = Color.magenta;
- public final static Color COLOR_WARNING_NS = new Color(255,135,17);
- public final static Color COLOR_WARNING_S = new Color(255,135,17);
- public Color _colorChangedNS = COLOR_CHANGED_NS;
- public Color _colorChangedS = COLOR_CHANGED_S;
- public Color _colorErrorNS = COLOR_ERROR_NS;
- public Color _colorErrorS = COLOR_ERROR_S;
- public Color _colorFilsNS = COLOR_FILS_NS;
- public Color _colorFilsS = COLOR_FILS_S;
- public Color _colorWarningNS = COLOR_WARNING_NS;
- public Color _colorWarningS = COLOR_WARNING_S;
- public Component getTreeCellRendererComponent(JTree tree,
- Object value,
- boolean sel,
- boolean expanded,
- boolean leaf,
- int row,
- boolean hasFocus){
- if (sel)
- {
- switch (etat.getMessageLevel())
- {
- case GenEtat.NIVEAU_CHANGED:
- setForeground(COLOR_CHANGED_S);
- break;
- case GenEtat.NIVEAU_ERROR:
- setForeground(COLOR_ERROR_S);
- break;
- case GenEtat.NIVEAU_WARNING:
- setForeground(COLOR_WARNING_S);
- break;
- case GenEtat.NIVEAU_FILS:
- setForeground(COLOR_FILS_S);
- break;
- case GenEtat.NIVEAU_NO_ERROR:
- default:
- setForeground(getTextSelectionColor());
- break;
- }
- }
- //remise en place des couleurs par défaut
- changeColor(false);
- }
- /**
- * surcharge pour l'implementation du FocusListener
- * change les couleurs qui vont etre utilisées par le getTreeCellRendererComponent
- * @author sgamier
- * @version 20041222
- * @param e L'evenement recu
- */
- public void focusGained(FocusEvent e){
- changeColor(false);
- }
- /**
- * surcharge pour l'implementation du FocusListener
- * Rétabli les couleurs par défaut, qui vont etre utilisées par le getTreeCellRendererComponent
- * @author sgamier
- * @version 20041222
- * @param e L'evenement recu
- */
- public void focusLost(FocusEvent e){
- changeColor(true);
- }
- /**
- * Mise a jour des couleurs utilisées par le
- * getTreeCellRendererComponent
- * @author sgamier
- * @version 20041222
- * @param pReverseColor booleen a true s'il faut
- * changer les couleurs, a false sinon
- */
- private void changeColor(boolean pReverseColor){
- if(pReverseColor){
- Color reverseColor = Color.orange;
- this.setTextSelectionColor (reverseColor);
- this.setTextNonSelectionColor (reverseColor);
- _colorChangedNS = reverseColor;
- _colorChangedS = reverseColor;
- _colorErrorNS = reverseColor;
- _colorErrorS = reverseColor;
- _colorFilsNS = reverseColor;
- _colorFilsS = reverseColor;
- _colorWarningNS = reverseColor;
- _colorWarningS = reverseColor;
- }else{
- this.setTextSelectionColor(UIManager.getColor("Tree.selectionForeground" ));
- this.setTextNonSelectionColor(UIManager.getColor("Tree.textForeground" ));
- _colorChangedNS = COLOR_CHANGED_NS;
- _colorChangedS = COLOR_CHANGED_S;
- _colorErrorNS = COLOR_ERROR_NS;
- _colorErrorS = COLOR_ERROR_S;
- _colorFilsNS = COLOR_FILS_NS;
- _colorFilsS = COLOR_FILS_S;
- _colorWarningNS = COLOR_WARNING_NS;
- _colorWarningS = COLOR_WARNING_S;
- }
- }
|
Voila....
J'espère que cela sera utile à d'autres.
Sébastien
|