Fond d'un bouton qui réapparait
Résolu
andredrea
Messages postés
227
Date d'inscription
Statut
Membre
Dernière intervention
-
andredrea Messages postés 227 Date d'inscription Statut Membre Dernière intervention -
andredrea Messages postés 227 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Fond d'un bouton qui réapparait
- Bouton reinitialisation pc - Guide
- Comment mettre une vidéo en fond d'écran - Guide
- Diagnostic bouton photo - Accueil - Outils
- Comment faire une capture d'écran sur un samsung sans bouton ? - Guide
- Faites afficher avec un fond coloré les cellules qui contiennent une valeur comprise entre 250 et 350. quel nombre est dessiné en surbrillance ? ✓ - Forum Excel
3 réponses
Bonjour,
Je ne suis pas sûr d'avoir bien compris le problème mais tu créé trop de ressources images cela vient peut-être de là.
Au de lieu de faire un
Remarque : il est maladroit de faire un addMouseListener(this); parce que ta classe devient fourre tout, à gérer à la fois le bouton et ses événements alors que ce sont deux choses hétérogènes.
De plus, le nom "Commencer" n'est pas très parlant, il ne permet de savoir que tu manipules un objet de type JButton...
Je ne suis pas sûr d'avoir bien compris le problème mais tu créé trop de ressources images cela vient peut-être de là.
Au de lieu de faire un
setIcon(new ImageIcon(...))à chaque fois, charges tes images une seule au fois et réutilises les mêmes objets.
Remarque : il est maladroit de faire un addMouseListener(this); parce que ta classe devient fourre tout, à gérer à la fois le bouton et ses événements alors que ce sont deux choses hétérogènes.
De plus, le nom "Commencer" n'est pas très parlant, il ne permet de savoir que tu manipules un objet de type JButton...
public class StartBouton extends JButton { private static final long serialVersionUID = 1; private static final Icon start = new ImageIcon("im/start.png"); private static final Icon start2 = new ImageIcon("im/start2.png"); private final Jeu jeu; public StartBouton(Jeu jeu) { super(); this.jeu = jeu; setDisabledIcon(start2); setPreferredSize(new Dimension(139, 50)); setContentAreaFilled(false); // transparence du fond setBorderPainted(false); // retire contour qd selection setIcon(start); addMouseListener(new LocalMouseListener()); } private final class LocalMouseListener implements MouseListener { @Override public void mouseClicked(MouseEvent e) { if (isEnabled()) { jeu.fenJeu(); } } @Override public void mousePressed(MouseEvent e) { setIcon(start2); } @Override public void mouseReleased(MouseEvent e) { setIcon(start); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } } }
Cela ne concerne pas ton soucis mais ta classe
En espérant t'avoir aider
Greg
LocalMouseListenerpourrait
extendsla classe abstraite
MouseAdapterplutôt que
implementsl'interface
MouseListenercomme ça tu n'aurais pas besoin d'implémenter les méthodes
MouseEnteredet
MouseExiteddont tu ne te sers pas.
En espérant t'avoir aider
Greg
En effet, mais j'ai voulu garder plus ou moins le même code que l'original.
andredrea utilisait un MouseListener alors je l'ai gardé...
Remarque : étendre MouseAdapter était impossible dans le code d'origine car on ne peut pas extends deux classes en même temps.
Cela rejoint un peu l'idée que le Listener (ou l'Adapter) ne devrait pas être implémenté dans la même classe que le JButton.
andredrea utilisait un MouseListener alors je l'ai gardé...
Remarque : étendre MouseAdapter était impossible dans le code d'origine car on ne peut pas extends deux classes en même temps.
Cela rejoint un peu l'idée que le Listener (ou l'Adapter) ne devrait pas être implémenté dans la même classe que le JButton.
Bonjour, merci beaucoup pour vos réponses se sont des fautes que j'ai corrigé !
J'utilise un mouselistener car j'ai par la suite eu besoin de toutes les méthodes
Le problème était, et je m'en doutais un peu, qu'a chaque fois que survole le bouton, le jpanel sur lequel il était, était redessiné donc j'ai du utiliser un repaint a chaque survole de souris. Le mystère est: pourquoi est il redessiné à chaque survol alors que je n'ai pas mis de fonction dans le MouseEntered si ce n'est que de changer l'image du bouton
(je viens de remarqué j'ai rempli les mauvaises fonctions ici, il s'agit bien de survol et non de pressed et release)
J'utilise un mouselistener car j'ai par la suite eu besoin de toutes les méthodes
Le problème était, et je m'en doutais un peu, qu'a chaque fois que survole le bouton, le jpanel sur lequel il était, était redessiné donc j'ai du utiliser un repaint a chaque survole de souris. Le mystère est: pourquoi est il redessiné à chaque survol alors que je n'ai pas mis de fonction dans le MouseEntered si ce n'est que de changer l'image du bouton
(je viens de remarqué j'ai rempli les mauvaises fonctions ici, il s'agit bien de survol et non de pressed et release)
Le mystère est: pourquoi est il redessiné à chaque survol
Java choisit quand il faut redessiner une zone, il peut ne jamais le faire pour certaines zones comme le faire des dizaines de fois de suite sur toute l'application.
Dans ton cas il faudrait regarder en détail mais le fait que tu survoles la zone tu dois avoir ton curseur (flèche, sablier, etc) qui se dessine par dessus, et si tu bouges un peu la souris il faut redessiner tout ce qu'il y avait sous le curseur sinon ça va laisser une trace le long du chemin de la souris.
Java choisit quand il faut redessiner une zone, il peut ne jamais le faire pour certaines zones comme le faire des dizaines de fois de suite sur toute l'application.
Dans ton cas il faudrait regarder en détail mais le fait que tu survoles la zone tu dois avoir ton curseur (flèche, sablier, etc) qui se dessine par dessus, et si tu bouges un peu la souris il faut redessiner tout ce qu'il y avait sous le curseur sinon ça va laisser une trace le long du chemin de la souris.