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 :

[Swing] Customisation JButton


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [Swing] Customisation JButton
    Bonjour à tous,

    je voudrais faire un bouton comme ceci :



    que l'ont pourrais instancier avec le path de l'image ainsi que le texte à afficher et éventuellement la couleur tu texte.


    J'ai commencer à faire ceci mais sans succès : (l'image ne s'affiche pas, apparent, on a pas trop le droit de faire un setLayout sur JButton, plus rien ne s'affiche en fait)
    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 class ApplicationButton extends JButton
    {
     
         /**
          *
          */
         private static final long serialVersionUID = 1L;
         private JButton button;
     
         public ApplicationButton(String imagePath, String name)
         {
             this.setLayout(new GridBagLayout());
     
             GridBagConstraints constraints = new GridBagConstraints(0, 0, 
    1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new 
    Insets(0, 0, 0, 0), 0, 0);
             this.button = new JButton(new ImageIcon(imagePath));
             this.button.setPreferredSize(new Dimension(90, 90));
             this.add(this.button, constraints);
         }
     
     
    }
    Si vous pouviez me donner quelques pistes.

    Merci d'avance
    NeoKript

  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
    Ce que tu cherches à faire est présenté en partie dans le tutoriel Sun standard:

    http://download.oracle.com/javase/tu...ts/button.html

    Pour ne pas afficher le fond et les bordures il suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ImageIcon middleButtonIcon = new ImageIcon(getClass.getressource("/chemin/dans/le/classpath");
    JButton b2 = new JButton("Musique", middleButtonIcon);
    b2.setVerticalTextPosition(AbstractButton.BOTTOM);
    b2.setHorizontalTextPosition(AbstractButton.CENTER);
    b2.setContentAreaFilled(false):
    b2.setOpaque(false);
    b2.setBorderPainted(false);

    Tu peux même mettre un rollover en place pour l'icone avec les méthode setRolloverIcon & cie.

  3. #3
    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 tu as plusieurs boutons de ce type, une autre solution serait de te créer ton propre composant associé à un UI.
    Chaque type de composant Swing est associé avec une UI spécifique (qui peut varier selon le LookAndFeel). Tu peux profiter de cela pour créer tes propres composants avec son propre UI indépendant du LnF...

    Pour cela il suffit de deux choses :
    • Redéfinir la méthode getUIClassID() pour indiquer le nom de ton UI.
    • Associer ce nom à une classe dans l'UIManager, par exemple via un bloc static



    On définirait ainsi notre composant personnalisé comme ceci :
    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
    public class JImageButton extends JButton {
     
    	/** Nom du l'UI qui servira à afficher le composant */
    	private static final String uiClassID = "MyButtonUI";
     
    	/* Au chargement de la classe,
    	 * on renseigne le nom de la classe dans l'UIManager
    	 */
    	static {
    		if (UIManager.get(uiClassID)==null) {
    			UIManager.put(uiClassID, ImageButtonUI.class.getName());
    		}
    	}
     
    	public JImageButton(String text, Icon icon) {
    		super(text, icon);
    	}
     
    	/**
             * On redéfinit la méthode getUIClassID()
             * pour associer notre UI à notre composant.
             */
    	@Override
    	public String getUIClassID() {
    		return uiClassID;
    	}
    }
    Puis il faut définir notre UI. Pour cela on peut se baser sur le package javax.swing.plaf.basic qui propose des UI de bases sur lequels se bases les autres UI. Dans notre cas BasicButtonUI est tout indiqué.

    Par convention notre UI doit avoir une méthode static createUI(JComponent) qui va créer l'UI de chaque composant. Dans notre cas comme il s'agit d'un composant simple on peut utiliser un seul et même UI pour tous les boutons.

    Le principal intérêt vient du fait que tu peux tout centraliser. Ainsi en redéfinissant la méthode "intallUI()" ou une des méthodes "installXX()" tu peux définir les propriétés par défaut pour les composants de ce type :
    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
    public class ImageButtonUI extends BasicButtonUI {
     
    	private static ImageButtonUI instance = new ImageButtonUI();
     
    	public static ComponentUI createUI(JComponent c) {
    		return instance;
    	}
     
    	@Override
    	protected void installDefaults(AbstractButton b) {
    		System.out.println("installDefaults()");
    		super.installDefaults(b);
    		b.setVerticalTextPosition(AbstractButton.BOTTOM);
    		b.setHorizontalTextPosition(AbstractButton.CENTER);
    		b.setContentAreaFilled(false);
    		b.setOpaque(false);
    		b.setBorderPainted(false);
    	}
    }
    Tu n'as plus qu'à utiliser JImageButton et il sera bien initialisé.

    Tu peux adapter l'UI comme tu veux pour que cela fasse exactement ce que tu veux, tout en impactant tous les composants

    Par exemple :
    • Tu pourrais générer automatiquement une icon de rollover si elle est absente.
    • Tu pourrais redéfinir les méthodes paintXXX() pour modifier le dessin de certaines parties de l'affichage.
    • etc.



    a++

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut et merci pour vos réponses,

    Je suis finalement arrivé à ce que je voulais avec ce que vous m'avez dit.

    Merci encore

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

Discussions similaires

  1. [Swing] Customisation de controle avec Swing
    Par loverdose dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 01/03/2007, 12h12
  2. [SWING]changer le background d'un JButton
    Par david06600 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 18/02/2006, 21h49
  3. image sur JButton (swing)
    Par loic_86 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 16/01/2006, 14h51
  4. [swing][JButton] Des boutons qui disparaissent!
    Par soulhouf dans le forum Débuter
    Réponses: 12
    Dernier message: 19/08/2005, 12h51
  5. [débutant][swing][JButton][ActionListener]
    Par cmoa59 dans le forum Composants
    Réponses: 6
    Dernier message: 25/05/2005, 15h19

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