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 :

Créer un bouton "imagé"


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut Créer un bouton "imagé"
    Bonjour,

    J'ai commencé le code d'une classe pour un bouton particulier.
    L'idée: les images du bouton sont des images (jpg, gif...) dans des dossiers que l'on passe en paramètre à la construction (ou avec des setters...) et le bouton se dessine tout seul, par exemple au survol de la sourie on change d'image...

    Le soucis: à la base j'avais fait dériver ma classe de JPanel. J'ai redéfinit paintComponent(Graphics) pour que le bouton se dessine. Jusque là: niquel !
    Mais un bouton doit pouvoir envoyer des événements aux ActionListener, et dans la classe JPanel il n'y a pas la méthode addActionListener(ActionListener).
    J'ai donc fait dériver ma classe de JButton, le problème c'est que paintComponent(Graphics) ne fait plus rien (rien de dessiné à l'écran, même si la méthode est bien appelée). J'ai essayé de mettre le dessin dans la méthode paint(Graphics) mais rien n'y fait également.

    Si ça peut aider, voici le code que j'ai déjà fait et qui fonctionne, le problème étant que addActionListener n'est pas définie dans JPanel et que je ne voie pas comment l'ajouter:
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.JPanel;
    import java.io.File;
     
     
    public class ImageBouton extends JPanel implements MouseListener {
     
    	private static final long serialVersionUID = 1L;
     
    	/** Etat du bouton à l'arrêt. */
    	public static final int ETAT_NORMAL = 0;
    	/** Etat du bouton quand survolé par la sourie. */
    	public static final int ETAT_HOVER = 1;
    	/** Etat du bouton quand cliqué. */
    	public static final int ETAT_CLIC = 2;
     
     
    	// Contient les images
    	private Image[] image;
     
    	// Etat du bouton
    	private int etat;
     
     
    	public ImageBouton() {
     
    		// Pas d'image par défaut
    		image = new Image[3];
    		image[0] = image[1] = image[2] = null;
     
    		// Le bouton s'écoute lui-même
    		addMouseListener(this);
     
    		// Initialisé à l'état normal au départ
    		etat = ETAT_NORMAL;
    	}
     
     
     
     
    	public boolean setImage(String filePath, int etat) {
     
    		// On teste l'existence du fichier
    		if( filePath != null && !new File(filePath).exists() )
    			return false;
     
    		// On test si l'état demandé existe
    		if( etat < 0 || etat > 2)
    			return false;
     
    		// On créer l'image
    		image[etat] = creerImage(filePath);
     
    		// Succès
    		return true;
    	}
     
     
     
    	public boolean setImages(String[] filePath) {
     
    		if(filePath == null || filePath.length < 2)
    			return false;
     
    		boolean chargement = true;
     
    		if( !setImage(filePath[ImageBouton.ETAT_NORMAL], ImageBouton.ETAT_NORMAL) )
    			chargement = false;
     
    		if( !setImage(filePath[ImageBouton.ETAT_HOVER], ImageBouton.ETAT_HOVER) )
    			chargement = false;
     
    		if( !setImage(filePath[ImageBouton.ETAT_CLIC], ImageBouton.ETAT_CLIC) )
    			chargement = false;
     
    		return chargement;
    	}
     
     
     
    	public void paintComponent(Graphics g) {
     
    		if( image[etat] != null )
    			g.drawImage(image[etat], 0, 0, this);
     
    	}
     
     
    	public void mousePressed(MouseEvent e) {
    		if( e.getSource() == this)
    			etat = ETAT_CLIC;
    		repaint();
    	};
     
    	public void mouseReleased(MouseEvent e) {
    		if( e.getSource() == this)
    			etat = ETAT_NORMAL;
    		repaint();
    	};
     
    	public void mouseClicked(MouseEvent e) { };
     
    	public void mouseEntered(MouseEvent e) {
    		if( e.getSource() == this)
    			etat = ETAT_HOVER;
    		repaint();
    	};
     
    	public void mouseExited(MouseEvent e) {
    		if( e.getSource() == this)
    			etat = ETAT_NORMAL;
    		repaint();
    	};
     
     
    	private Image creerImage(String filePath) {
    		return Toolkit.getDefaultToolkit().getImage(filePath);
    	}
     
    }
    Merci pour votre aide !

  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
    En fait il te suffit d'avoir un JButton tout simple, de passer la méthode isContentAreaFilled à false, la méthode setBorderPainted à false et de fixer tes icônes avec les méthodes ,setRolloverIcon, setRolloverSelectedIcon, setIcon

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Arf j'avais regardé la doc pour JButton alors que ces méthodes étaient dans AbstractButton !
    Merci beaucoup pour le coup de main en tout cas, ça m'apprendra à ne pas savoir lire la doc

    Si ça intéresse quelqu'un, voici le code "final".
    A noter que la méthode paintComponent(Graphics) peut être maintenant
    modifiée pour avoir un bouton ayant un comportement graphique très spécifique.

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    import java.awt.*;
    import java.awt.event.*;
     
    import javax.swing.JButton;
    import javax.swing.ImageIcon;
    import java.io.File;
     
     
    public class ImageBouton extends JButton {
     
     
        private static final long serialVersionUID = 1L;
     
     
        /** Etat du bouton à l'arrêt. */
        public static final int ETAT_NORMAL = 0;
        /** Etat du bouton quand survolé par la sourie. */
        public static final int ETAT_HOVER = 1;
        /** Etat du bouton quand cliqué. */
        public static final int ETAT_CLIC = 2;
     
     
        /**
         * Créer un bouton image sans label textuel.
         */
        public ImageBouton() {
     
            super();
            setContentAreaFilled(false);
            setBorderPainted(false);
        }
     
        /**
         * Créer un bouton image avec label textuel.
         */
        public ImageBouton(String label) {
     
            super(label);
            setContentAreaFilled(false);
            setBorderPainted(false);
        }
     
     
     
        /**
         * Définit quel fichier image utiliser pour un etat du bouton.
         * <br />Le bouton peut avoir 3 états différents, définit dans des constantes
         * statiques:
         * <br /><ul>
         *     <li><b>ImageBouton.ETAT_NORMAL</b> - Le bouton est à l'arrêt</li>
         *     <li><b>ImageBouton.ETAT_HOVER</b> - Le bouton est survolé par le curseur</li>
         *     <li><b>ImageBouton.ETAT_CLIC</b> - Le bouton est cliqué</li>
         * </ul>
         *
         * @param filePath Le chemin du fichier image
         * @param etat La constante d'état du bouton
         * @return <i>true</i> si le chargement à réussi, <i>false</i> sinon
         * @see ImageBouton#setImages(String[])
         * @see ImageBouton#ETAT_NORMAL
         * @see ImageBouton#ETAT_HOVER
         * @see ImageBouton#ETAT_CLIC
         */
        public boolean setImage(String filePath, int etat) {
     
            // On teste l'existence du fichier
            if( filePath != null && !new File(filePath).exists() )
                return false;
     
            // On test si l'état demandé existe
            if( etat < 0 || etat > 2)
                return false;
     
            // On créer l'image
            switch( etat ) {
     
                case ETAT_NORMAL:
                    setIcon( new ImageIcon(filePath) );
                    break;
     
                case ETAT_HOVER:
                    setRolloverIcon( new ImageIcon(filePath) );
                    break;
     
                case ETAT_CLIC:
                    setRolloverSelectedIcon( new ImageIcon(filePath) );
                    break;
     
                default:
                    return false;
            }
     
            System.out.println("Chargement ok pour " + filePath);
     
            // Succès
            return true;
        }
     
     
        /**
         * Définit quels fichiers image utiliser pour le bouton.
         * <br />Il faut passer en argument les chemins vers 3 fichiers images:
         * <br /><ul>
         *     <li>Le bouton est à l'arrêt</li>
         *     <li>Le bouton est survolé par le curseur</li>
         *     <li>Le bouton est cliqué</li>
         * </ul>
         * <br />Si la méthode retourne false, il se peut que certains fichiers
         * passés en argument aient correctement été chargé.
         *
         * @param filePath Le chemin du fichier image
         * @return <i>true</i> si tous les chargements ont réussi, <i>false</i> sinon
         * @see ImageBouton#setImage(String, int)
         */
        public boolean setImages(String[] filePath) {
     
            if(filePath == null || filePath.length < 2)
                return false;
     
            boolean chargement = true;
     
            if( !setImage(filePath[ImageBouton.ETAT_NORMAL], ImageBouton.ETAT_NORMAL) )
                chargement = false;
     
            if( !setImage(filePath[ImageBouton.ETAT_HOVER], ImageBouton.ETAT_HOVER) )
                chargement = false;
     
            if( !setImage(filePath[ImageBouton.ETAT_CLIC], ImageBouton.ETAT_CLIC) )
                chargement = false;
     
            return chargement;
        }
     
     
        /**
         * Dessine le bouton, est appelé automatiquement.
         * <br />Pour forcer le dessin, appeler repaint().
         *
         * @param g Contexte graphique
         * @see AbstractButton#repaint()
         */
        public void paintComponent(Graphics g) {
     
            super.paintComponent(g);
     
            /* Ici dessin possible avec g */
        }
     
    }
    Merci à toi

    =>

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

Discussions similaires

  1. [VB.Net] "Impossible de créer le handle de fenêtre"
    Par cedric_g dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/04/2006, 12h49
  2. Réponses: 4
    Dernier message: 04/10/2005, 00h15

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