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

Composants Java Discussion :

Changer la couleur d'un JButton


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Changer la couleur d'un JButton
    Bonjour,

    j'essaie de changer les couleurs de fond et du texte d'un JButton. La raison est que sur certaines plates-formes (par exemple un MAC) lorsque l'on applique setEnabled(false); le texte du bouton n'est pas visible (alors que sous Windows c’est OK).

    Le problème est qu'en version 8.x de Java les méthodes setForeground(...) ou setBackground(..) n'ont aucun effet.

    Je sais que je pourrais changer les couleurs par défaut en modifiant le "look and feel" mais ceci s'appliquerait à tous les boutons de mon panneau, ce que je ne souhaite pas.

    Existe t-il une solution simple ?

    Merci d'avance.

    Gégé

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    En cherchant sur différents forums, j'ai trouvé une solution que j'ai adaptée et qui me convient, en créant GButton qui est une extension de JButton.
    Au cas où d'autres étaient confrontés au même problème et pour leur éviter de perdre du temps, voici une solution qui fonctionne :

    Bonne chance

    Gégé

    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
     
     
    package gegeutil;
    /**
     * GButton est une extension de JButton, le look-and-Feel de Windows ne peint plus les boutons depuis JDK 1.3
     * mais ne trace que le contour dans la couleur de background. 
     * Il a donc fallu modiifer la methode paintComponent pour peindre le bouton.  
     */
    import java.awt.*;
    import javax.swing.*;
     
    public class GButton extends javax.swing.JButton 
    {
    	private static final long serialVersionUID = -9120456666677313853L;
     
    public  GButton ()
    {
    }
     
    public  void paintComponent(java.awt.Graphics g)
    {
    	super.paintComponent(g);	 // pas vraiment nécessaire, mais on ne sait jamais.....
    	g.setColor(getBackground());   // on établit la couleur du fond
    	Rectangle r = new Rectangle();  // caractéristiques du bouton (coordonnées  et tailles)
    	AbstractButton ab = (AbstractButton) this ;
    	Insets i =  getInsets();
    	r.x = i.left;
            r.y = i.top;
            r.width = ab.getWidth() - (i.right + r.x);
            r.height = ab.getHeight() - (i.bottom +r.y);
    	g.fillRect(r.x, r.y, r.width, r.height);     // on peint le bouton
     
    	// après cela il faut remettre le texte
    	String t = getText();	//  d'abord on le lit 
    	Font f = g.getFont();	// on récupère la font du texte
    	FontMetrics metrics = g.getFontMetrics(f);	// et ses caractéristiques métriques
    	java.awt.geom.Rectangle2D s = metrics.getStringBounds(t,g); // on obtient le rectangle contenant le texte
     	 r =g.getClipBounds();	
    	int x=0, y = 0; 
    	if (s.getWidth() < r.width) x = r.x + (r.width - (int)s.getWidth() )/2;  	// abscisse du texte
    	if (s.getHeight() < r.height) y = r.y + r.height - (r.height -(int)s.getHeight())/2 ; // ordonnée  du texte
    	g.setColor(getForeground());  // couleur du texte
     
    	g.drawString(getText(), x, y-4); 		 // on l'écrit dans le rectangle
     
    }
     
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il n'y a pas de raison qu'en Java 8 setBackground et setForeground ne fonctionne pas ! Maintenant, cela peut ne pas agir sur ce que tu penses que ça agit : tout dépend du look and feel en fait (il y a parfois des bugs, ou des soucis graphiques avec certaines releases de jvm, sur GTK, en particulier, mais il n'y a pas de raison que des méthodes de classes de bibliothèques Swing ne fonctionnent plus dans une version de Java). Avec un look and feel standard sous Windows, cela fonctionne :

    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
    import java.awt.Color;
    import java.awt.GridBagLayout;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class JButtonColor {
     
    	public static void main(String[] args) {
     
    		JButton button = new JButton("toto");
    		button.setForeground(Color.RED);
    		button.setBackground(Color.BLUE); 
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel(new GridBagLayout());
    		panel.add(button);
     
    		frame.add(panel);
     
    		frame.setSize(300,300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    Nom : Capture.PNG
Affichages : 6667
Taille : 2,5 Ko

    Seulement en fait ça ne fonctionne pas vraiment, parce que même avec le look and feel que j'utilise, il y'a des effets et le fait de changer juste comme ça les couleurs fout la zone (par exemple, dans mon cas, je n'ai plus d'effet graphique cohérent (l'effet de relief), le bouton ne s'arme visuellement plus sur le hover, et il faudrait que je change aussi la couleur de la bordure parce que ça fait crade, et peut-être aussi celle pour le cadre de focus, etc). Pour changer les couleurs, il vaut mieux passer par les thèmes, donc utiliser un look and feel qui le supporte, ou des options propres au look and feel, prévues pour et qui vont permettre justement d'affecter l'ensemble des décorations du composant.

    En fait, personnellement, je suis contre la personnalisation des couleurs par l'application : c'est de la prérogative de l'utilisateur de choisir les couleurs qui lui conviennent (en particulier parce qu'il y a des daltoniens par exemple qui pourront ne rien voir du tout si tu leur impose des couleurs).

    Maintenant si on revient au problème initial qui t'a amené à chercher à modifier les couleurs, cela semble être à priori du bug sur Mac, ou de la feature (on ne sait jamais, peut-être Apple a-t-il décidé dans la dernière version que les boutons désactivés apparaîtrait sans texte). Cela peut être aussi un bug de ton côté : si tu nous montrais ton code, on pourrait peut être le voir.
    A voir déjà quelle JVM tu utilises (Java 8 ou 9), si le bug est connu (et donc quand est-il prévu qu'il soit corrigé, ou s'il y a un contournement officiel).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/01/2015, 15h24
  2. [JButton] Changer la couleur en conservant le dégradé
    Par Oussama_Gabes dans le forum Composants
    Réponses: 3
    Dernier message: 13/04/2008, 11h10
  3. Changer la couleur du texte dans un Jbutton
    Par jojo57 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/12/2006, 21h15
  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