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 :

Donner le look & feel d'un JButton à un JPanel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut Donner le look & feel d'un JButton à un JPanel
    Bonjour,

    J'aimerais donner la même présentation, même look and feel qu'un JButton à un JPanel. Que le JPanel ait le même dégradé de bleu qu'un JButton basique.

    Dans un premier temps j'ai essayé d'utiliser des méthodes tels que setBackground(), setBorder(). Malheureusement je n'ai pas trouvé la méthode adéquate.

    Peut-être que la solution est de rajouter un JButton sans texte en fond du JPanel avec BorderLayout.CENTER.

    D'avance merci pour vos réponses.


    EDIT : Ce qui pourrait m'aider, c'est de pouvoir lire la méthode paintComponent(Graphics g) de JButton afin de la copier et de modifier les élements qui m'intéressent. Cependant je n'ai pas trouvé cette méthode, ni dans JButton ou AbstractButton. Je n'arrive pas à trouver l'endroit où le JButton est dessiné.



    xenos

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La définition du gradient que tu cherches se trouve dans la classe OceanTheme qui se trouve dans le package javax.swing.plaf.metal

    Le plus simple pour toi serait d'écrire une classe MyPanelUI héritant de BasicPanelUI et redéfinissant la méthode paint qui sert à dessiner le composant.

    Dans cette version de paint tu appelles puis tu dessines le gradient au moyen de l'appel suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MetalUtils.drawGradient(
                            c, g, "Button.gradient", 0, 0, c.getWidth(),
                            c.getHeight(), true);

    Puis tu affecte cette UI à ton JPanel via la méthode setUI.

  3. #3
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Merci de ta réponse Sinok.

    Mais la classe à laquelle tu fais référence est de type package friendly. Je ne peux donc pas y accéder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package javax.swing.plaf.metal;
     
    [...]
     
    class MetalUtils {
    Cependant j'ai trouvé, ce qui semble être la classe qui permet de dessiner un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public  class MetalButtonUI extends  BasicButtonUI {
    Malheureusement, elle fait aussi appel à cette classe en package friendly ..

    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
        public void update(Graphics g, JComponent c) {
            AbstractButton button = (AbstractButton)c;
            if ((c.getBackground() instanceof UIResource) &&
                      button.isContentAreaFilled() && c.isEnabled()) {
                ButtonModel model = button.getModel();
                if (!MetalUtils.isToolBarButton(c)) {
                    if (!model.isArmed() && !model.isPressed() &&
                            MetalUtils.drawGradient(
                            c, g, "Button.gradient", 0, 0, c.getWidth(),
                            c.getHeight(), true)) {
                        paint(g, c);
                        return;
                    }
                }
                else if (model.isRollover() && MetalUtils.drawGradient(
                            c, g, "Button.gradient", 0, 0, c.getWidth(),
                            c.getHeight(), true)) {
                    paint(g, c);
                    return;
                }
            }
            super.update(g, c);
        }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ce cas tu prends le code qui te va dans la méthode MetalUtils et tu te fait une classe à partir de ça.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si c'est pour avoir exactement le même fond, tu peux tout simplement utiliser un "faux JButton" que tu n'utiliseras que pour dessiner le fond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    		panel.setUI(new PanelUI() {
     
    			private final JButton fakeButton = new JButton();
     
    			@Override
    			public void update(Graphics g, JComponent c) {
    				if (c.isOpaque()) {
    		        	fakeButton.setSize(c.getWidth(), c.getHeight());
    		        	fakeButton.paint(g);
    		        }
    				paint(g, c);
    			}
     
    		});

    Maintenant si c'est uniquement pour avoir un dégradé, il y a plusieurs moyens de faire cela dans l'API de Graphics...


    a++

  6. #6
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Merci de ta réponse adiguba.

    Sinon une autre solution qui serait plus pratique dans mon cas. Etant donné que je dois pouvoir le mettre à jour avec la méthode repaint.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void paintComponent(Graphics g)
    {
    	super.paintComponent(g);
     
    	Color backgroundEdge = new Color(184, 207, 229, 200);
    	Color backgroundCenter = new Color(255, 255, 255, 200);
     
    	Graphics2D g2 = (Graphics2D) g;
    	g2.setPaint(new GradientPaint(0, this.getHeight()-1, backgroundEdge, 0, this.getHeight()/3, 
    			backgroundCenter, true));
    	g2.fillRect(0, 0, this.getWidth()-1, this.getHeight()-1);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49
  2. [look and feel] Ou les trouver ?
    Par olive.m dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 08/03/2004, 18h42
  3. Nouveau look and feel
    Par julian_ross dans le forum JBuilder
    Réponses: 6
    Dernier message: 16/12/2003, 15h55
  4. Jbuilder9 Look and feel de borland
    Par wsrudmen dans le forum JBuilder
    Réponses: 6
    Dernier message: 26/06/2003, 18h07

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