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

AWT/Swing Java Discussion :

[JSlider] Changer le couleur d'un JSlider ?


Sujet :

AWT/Swing Java

  1. #1
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut [JSlider] Changer le couleur d'un JSlider ?
    Bonjour,

    Je cherche à modifier la couleur du knob et du track d'un JSlider en ajoutant un masque transparant

    J'imagine qui faut redefinir leurs méthodes paint pour ajouter un masque de couleur, mais comment récupérer les instances de ces deux objets ?
    Ou alors je ne suis pas sur la bonne voie ?

    Merci
    Nico

    PS:
    Je précise que la couleur doit changer suivant l'état de mon slider et que si possible c'est modif soit prise en compte pour tous les L&F

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 114
    Par défaut
    idem pour moi,(surtout le ps)
    PS:
    Je précise que la couleur doit changer suivant l'état de mon slider et que si possible c'est modif soit prise en compte pour tous les L&F
    comment on recupere les couleurs principles du look&feel? ca serait bien pratique

  3. #3
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    J'ai regardé dans les classes BasicSliderUI et MetalSliderUI et il y a les méthodes paintThumb et paintTrack pour dessiner respectivement le knob et le track.
    Faut que je trouve comment appliquer mon masque après leur appel, je piste

    Citation Envoyé par eclesia
    comment on recupere les couleurs principles du look&feel? ca serait bien pratique
    Si tu regarde dans la classe MetalLookAndFeel, il y a un tas de methode static pour récupérer les couleurs utilisées dans le Look.
    Je ne sais pas si c'est pareil pour les L&F natif !

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 114
    Par défaut
    si on avait une reponse de quelqu'un qui c'est amusé a faire un look&feel ca nous avancerait.

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bon le début de la méthode paintThumb du BasicSliderUI (et oui en java ça s'appelle le thum et pas le knob, va savoir pourquoi)


    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
     
     
    public void paintThumb(Graphics g)  {        
            Rectangle knobBounds = thumbRect;
            int w = knobBounds.width;
            int h = knobBounds.height;      
     
            g.translate(knobBounds.x, knobBounds.y);
     
            if ( slider.isEnabled() ) {
                g.setColor(slider.getBackground());
            }
            else {
                g.setColor(slider.getBackground().darker());
            }
    et sinon au niveau UIManager la valeur doit être dans "Slider.background"

    [edit] ou pas en fait - je verrais ce soir en rentrant du taf [/edit]

  6. #6
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Donc c'est la méthode paint de la classe BasicSliderUI qui appelle les méthodes paintThumb et paintTrack. Si qqn pouvait me dire comment oppérer maintenant, ca m'eviterait de faire des betises

    Edit :
    Merci sinok,

    Le classe MetalSliderUI redefini la methode paintThumb(), je ne peux donc pas modifier celle de BasicSliderUI car elle va être écrasée.
    Comment appliquer ma modif alors ?

    "Slider.background" doit avoir le même effet que JSlider.setBackground(), qui modifie la couleur de fond du panel accueillant le slider. c'est pas vraiment ca que je cherche.

    Sinon comment connaitre les clé reconnu par UIManager ?

    Je continue a chercher de mon coté

  7. #7
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Pour illustrer, voila le resultat que j'aimerais obtenir

    La couleur dépend de l'état d'un objet associé à mon slider

    Ici c'est un programme pur GTK, mais je souhaiterais qqs chose de similaire avec le L&F windows et metal ocean.

    Nico

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Malheureusement pour vous, dans metal le thumb est une Icon....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    horizThumbIcon = SAFE_HORIZ_THUMB_ICON =
                    UIManager.getIcon( "Slider.horizontalThumbIcon" );
    Et en ce qui concerne les l&f natifs faut voir.

  9. #9
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    C'est un icon oui, mais il est dessiné dans le graphique, donc je peux tjrs appliquer un masque sur le graphique final, non ?

    Sinon avec un setBackground, c'est un peu la loterie, fonctionne avec metal et windows (juste le fond du panel, gtk ne voit rien et motif modifie que la couleur du track
    Bon je sens que ca être une galère à gérer cette bestiolle.

    Je garde tout de même un espoir en me basant uniquement sur le l&f metal et j'utiliserais JGoodies Form pour un l&f potable (il ne redefinie pas MetalSliderUI)

    Qqn d'autre apporter sa contribuation a ce sujet ? Romain ?

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il a l'air un peu occupé en ce moment le Gfx, on l'a plus vu depuis un moment

    En ce sui concerne métal j'ai plus que l'impression que l'icône est présente physiquement dans java et n'est pas redessinée.

  11. #11
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Citation Envoyé par sinok
    Il a l'air un peu occupé en ce moment le Gfx, on l'a plus vu depuis un moment
    Fallait essayer
    Citation Envoyé par sinok
    En ce sui concerne métal j'ai plus que l'impression que l'icône est présente physiquement dans java et n'est pas redessinée.
    Le code de la classe MetalSliderUI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paintThumb(Graphics g)  {
            Rectangle knobBounds = thumbRect;
     
            g.translate( knobBounds.x, knobBounds.y );
     
            if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
                getHorizThumbIcon().paintIcon( slider, g, 0, 0 );
            }
    Tu t'y connais plus que moi, mais l'icon n'est pas dessiné dans le graphic la ?

  12. #12
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    elle est dessinée dans le graphic, mais c'est une icône à la base car getHorizonThumbIcon renvoie l'attribut suivant:

    qui est une Icon, donc pas aisément modifiable (enfin si en partant sur des bases d'intersection de formes (enfin d'Area)

    Mais dans ce cas là autant redéfinir une BasicMetalUI

  13. #13
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Citation Envoyé par sinok
    elle est dessinée dans le graphic, mais c'est une icône à la base car getHorizonThumbIcon renvoie l'attribut suivant:

    qui est une Icon, donc pas aisément modifiable (enfin si en partant sur des bases d'intersection de formes (enfin d'Area)

    Mais dans ce cas là autant redéfinir une BasicMetalUI
    Oui mais je veux juste en modifier la couleur, je peux pas rajouter un masque de couleur dessus le graphics une fois l'icon dessiné, une zone de couleur par dessus avec une valeur alpha quoi ?
    Par contre je ne vois pas ou je peux rajouter mon code, car la couleur doit dependre d'une condition.

    Sinon, si je decide de redefinir BasicSliderUI (voir MetalSliderUI), pour passer l'etat de mon slider, j'utilise UIDefault.put() ?
    Vu comme cela, ca peut être une bonne solution !

  14. #14
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Re,

    Je viens de découvrir qu'en réalité les icons de metal ne sont pas de vrai icons, mais belle et bien du dessin.
    Il ne devrait pas etre trop difficile de redefinir cette classe pour lui ajouter un masque de couleur maintenant et en passant la couleur via un UIDefault.put()
    Quelques pour me dire comment rajouter un masque de couleur sur le dessin final ?
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    private static class OceanHorizontalSliderThumbIcon extends CachedPainter
                                  implements Icon, Serializable, UIResource {
            // Used for clipping
            private static Polygon THUMB_SHAPE;
     
            static {
                THUMB_SHAPE = new Polygon(new int[] { 0, 14, 14,  7,  0 },
                                          new int[] { 0,  0,  8, 15,  8 }, 5);
            }
     
            OceanHorizontalSliderThumbIcon() {
                super(3);
            }
     
            public void paintIcon(Component c, Graphics g, int x, int y) {
                if (!(g instanceof Graphics2D)) {
                    return;
                }
                paint(c, g, x, y, getIconWidth(), getIconHeight(), 
                      c.hasFocus(), c.isEnabled(),
                      MetalLookAndFeel.getCurrentTheme());
            }
     
     
            protected Image createImage(Component c, int w, int h,
                                        GraphicsConfiguration config,
                                        Object[] args) {
                if (config == null) {
                    return new BufferedImage(w, h,BufferedImage.TYPE_INT_ARGB);
                }
                return config.createCompatibleImage(
                                    w, h, Transparency.BITMASK);
            }
     
            protected void paintToImage(Component c, Image image, Graphics g2,
                                        int w, int h, Object[] args) {
                Graphics2D g = (Graphics2D)g2;
                boolean hasFocus = ((Boolean)args[0]).booleanValue();
                boolean enabled = ((Boolean)args[1]).booleanValue();
     
                // Fill in the background
                Rectangle clip = g.getClipBounds();
                g.clip(THUMB_SHAPE);
                if (!enabled) {
                    g.setColor(MetalLookAndFeel.getControl());
                    g.fillRect(1, 1, 13, 14);
                }
                else if (hasFocus) {
                    MetalUtils.drawGradient(c, g, "Slider.focusGradient",
                                            1, 1, 13, 14, true);
                }
                else {
                    MetalUtils.drawGradient(c, g, "Slider.gradient",
                                            1, 1, 13, 14, true);
                }
                g.setClip(clip);
     
                // Draw the frame
                if (hasFocus) {
                    g.setColor(MetalLookAndFeel.getPrimaryControlDarkShadow());
                }
                else {
                    g.setColor(enabled ? MetalLookAndFeel.getPrimaryControlInfo() :
                               MetalLookAndFeel.getControlDarkShadow());
                }
     
                g.drawLine(  1,0  , 13,0 );  // top
                g.drawLine(  0,1  ,  0,8 );  // left
                g.drawLine( 14,1  , 14,8 );  // right
                g.drawLine(  1,9  ,  7,15 ); // left slant
                g.drawLine(  7,15 , 14,8 );  // right slant
     
                if (hasFocus && enabled) {
                    // Inner line.
                    g.setColor(MetalLookAndFeel.getPrimaryControl());
                    g.fillRect(1, 1, 13, 1);
                    g.fillRect(1, 2, 1, 7);
                    g.fillRect(13, 2, 1, 7);
                    g.drawLine(2, 9, 7, 14);
                    g.drawLine(8, 13, 12, 9);
                }
            }
     
            public int getIconWidth() {
                return 15;
            }
     
            public int getIconHeight() {
                return 16;
            }
        }
    Sinon, la classe MetalSliderUI utilise aussi les propriété Slider.horizontalThumbIcon et Slider.verticalThumbIcon pour passer directement des images. Par contre on perd l'effet de focus, alors je vais redefinir la classe, pour permettre de passer aussi une image representant le focus.

    A part si quelqu'un répond à la première solution

    merci

    PS: faut que je me colle au track maintenant

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/05/2004, 11h18
  2. [Forms] changer les couleurs
    Par Nounoursonne dans le forum Forms
    Réponses: 11
    Dernier message: 02/04/2004, 09h40
  3. [VB6]Changer la couleur d'une ligne d'un ListView
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/03/2003, 17h02
  4. Changer la couleur de fond de l'écran
    Par tnk dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 19/01/2003, 01h37
  5. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55

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