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 -
Bonjour,
je suis en train de programmer un jeu en java et j'ai remarqué quelque chose d'étrange.
J'ai créé un bouton avec une image et j'ai rendu le bouton invisible de sorte de ne voir que l'image en tant que bouton. Tous mes boutons fonctionnent normalement sauf un dans un panel différent. Quand je le survole, la partie transparente de l'image (ou du bouton?!) devient opaque a force de passer ma souris dessus.
Je ne sais pas si c'est clair. Pourtant je n'ai rien défini dans entered
Je me demandais si ca vous ait déjà arrivé
voici la classe du bouton:
je le définis dans la classe jeu:
la ou je l'utilise:
MERCI
je suis en train de programmer un jeu en java et j'ai remarqué quelque chose d'étrange.
J'ai créé un bouton avec une image et j'ai rendu le bouton invisible de sorte de ne voir que l'image en tant que bouton. Tous mes boutons fonctionnent normalement sauf un dans un panel différent. Quand je le survole, la partie transparente de l'image (ou du bouton?!) devient opaque a force de passer ma souris dessus.
Je ne sais pas si c'est clair. Pourtant je n'ai rien défini dans entered
Je me demandais si ca vous ait déjà arrivé
voici la classe du bouton:
import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.ImageIcon; import javax.swing.JButton; public class Commencer extends JButton implements MouseListener{ private final Jeu m; public Commencer(Jeu m) { // TODO Auto-generated constructor stub super(); this.m = m; this.setDisabledIcon(new ImageIcon("im/start2.png")); this.setPreferredSize(new Dimension(139, 50)); this.setContentAreaFilled(false); //transparence du fond this.setBorderPainted(false); //retire contour qd selection this.setIcon(new ImageIcon("im/start.png")); addMouseListener(this); } public void mouseClicked(MouseEvent e){ if(this.isEnabled()){ m.fenJeu(); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed(MouseEvent e){ this.setIcon(new ImageIcon("im/start2.png")); } public void mouseReleased(MouseEvent e) { this.setIcon(new ImageIcon("im/start.png")); // TODO Auto-generated method stub } }
je le définis dans la classe jeu:
private final Commencer leBtnc= new Commencer(this);
la ou je l'utilise:
JPanel panBtn = new JPanel(new FlowLayout(FlowLayout.CENTER)); panBtn.add(leBtnc); panBtn.setOpaque(false);
MERCI
A voir également:
- Fond d'un bouton qui réapparait
- 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
- Bouton home clavier ✓ - Forum PC portable
- Bouton on/off comment savoir ✓ - Forum Matériel & Système
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.