Fond d'un bouton qui réapparait

Résolu/Fermé
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 - Modifié par andredrea le 26/03/2016 à 18:56
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 - 7 avril 2016 à 21:47
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:

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

3 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
26 mars 2016 à 20:59
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
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) {
        }
    }
}
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
Modifié par greg6614 le 27/03/2016 à 15:24
Cela ne concerne pas ton soucis mais ta classe
LocalMouseListener
pourrait
extends
la classe abstraite
MouseAdapter
plutôt que
implements
l'interface
MouseListener
comme ça tu n'aurais pas besoin d'implémenter les méthodes
MouseEntered
et
MouseExited
dont tu ne te sers pas.

En espérant t'avoir aider 
Greg
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
27 mars 2016 à 15:29
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.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
27 mars 2016 à 21:44
Il est vrai je n'avais regardé que le code de ton post en pensant que c'était le même, je n'avais pas fais gaffe que tu avais modifié la structure.
0
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 3
5 avril 2016 à 09:48
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)
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 5/04/2016 à 19:35
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.
0
andredrea Messages postés 227 Date d'inscription lundi 12 octobre 2009 Statut Membre Dernière intervention 3 mars 2021 3
7 avril 2016 à 21:47
AAAH d'accord en effet je comprend mieux !! Merci beaucoup
0