Partage
  • Partager sur Facebook
  • Partager sur Twitter

mon bouton ne reagit pas aux evenements

Sujet résolu
    5 décembre 2010 à 22:50:32

    Salut
    je débute avec java et je suis en train de lire le tuto du site, mais il y a un problème au niveau du code suivant, et j'arrive pas a règler :s
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
     
     
    class Bouton extends JButton implements MouseListener{
    	 
        private String name;
    private Image img;
        
    public Bouton(String str){
            super(str);
            this.name = str;
            
            try {
                                img = ImageIO.read(new File("fondBouton.png"));
                       } catch (IOException e) {
                               // TODO Auto-generated catch block
                               e.printStackTrace();
                       }
                       
                       this.addMouseListener(this);
    }
    
    public void paintComponent(Graphics g){
                
            Graphics2D g2d = (Graphics2D)g;
           
            GradientPaint gp = new GradientPaint(0, 0, Color.blue, 0, 20, Color.cyan, true);
            g2d.setPaint(gp);
           // g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
           g2d.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
            
            g2d.setColor(Color.black);
            g2d.drawString(this.name, this.getWidth() / 2 - (this.getWidth() / 2 /4), (this.getHeight() / 2) + 5);
           
    }
    
       @Override
       public void mouseClicked(MouseEvent event) {
                //Pas utile d'utiliser cette méthode ici                      
       }
    
       @Override
       public void mouseEntered(MouseEvent event) {
               
               //Nous changeons le fond en jaune pour notre image lors du survol
               //avec le fichier fondBoutonHover.png
               try {
                        img = ImageIO.read(new File("jaune.png"));
               } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                       System.out.println("jaune.png non trouvé");
               }
               
       }
    
       @Override
       public void mouseExited(MouseEvent event) {
    
               //Nous changeons le fond en vert pour notre image lorsqu'on quitte le bouton
               //avec le fichier fondBouton.png
               try {
                        img = ImageIO.read(new File("vert.png"));
               } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                       System.out.println("vert.png non trouvé");
               }
               
       }
    
       @Override
       public void mousePressed(MouseEvent event) {
    
               //Nous changeons le fond en orangé pour notre image lors du clic gauche
               //avec le fichier fondBoutonClic.png
               try {
                        img = ImageIO.read(new File("rouge.png"));
               } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                       System.out.println("rouge.png non trouvé");
               }
               
       }
    
       @Override
       public void mouseReleased(MouseEvent event) {
               
               //Nous changeons le fond en orangé pour notre image 
               //lorsqu'on relâche le clic 
               //avec le fichier fondBoutonHover.png
               try {
                        img = ImageIO.read(new File("rouge.png"));
               } catch (IOException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
               }               
       }       
    }
    
    class Fenetre extends JFrame{
    	 
        private Panneau pan = new Panneau();
        private JButton bouton = new JButton("mon bouton");
        private JPanel container = new JPanel();
        
        public Fenetre(){
                
                this.setTitle("Animation");
                this.setSize(300, 300);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setLocationRelativeTo(null);
                
                container.setBackground(Color.white);
                container.setLayout(new BorderLayout());
                container.add(pan, BorderLayout.CENTER);
                container.add(bouton, BorderLayout.SOUTH);
                
                this.setContentPane(container);
                this.setVisible(true);
                
                go();
        }
        
        
        private void go(){
                
                //Les coordonnées de départ de notre rond
                int x = pan.getPosX(), y = pan.getPosY();
                //Le booléen pour savoir si on recule ou non sur l'axe X
                boolean backX = false;
                //Le booléen pour savoir si on recule ou non sur l'axe Y
                boolean backY = false;
                
                //Pour cet exemple, j'utilise une boucle while
                //Vous verrez qu'elle fonctionne très bien
                while(true){
                        
                        //Si la coordonnée x est inférieure à 1, on avance
                        if(x < 1)backX = false;
                        //Si la coordonnée x est supérieure à la taille du panneau 
                        //moins la taille du rond, on avance
                        if(x > pan.getWidth()-50)backX = true;
                        
                        //idem pour l'axe Y
                        if(y < 1)backY = false;
                        if(y > pan.getHeight()-50)backY = true;
                        
                        //Si on avance, on incrémente la coordonnée
                        if(!backX)
                                pan.setPosX(++x);
                        //Sinon, on décrémente
                        else
                                pan.setPosX(--x);
                        
                        //Idem pour l'axe Y
                        if(!backY)
                                pan.setPosY(++y);
                        else
                                pan.setPosY(--y);
                                
                        //On redessine notre panneau
                        pan.repaint();
                        
                        //Comme on dit : la pause s'impose ! Ici, 3 centièmes de secondes
                        try {
                                Thread.sleep(3);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                
        }
        
    }
        
    class Panneau extends JPanel {
    	 
        public void paintComponent(Graphics g){
            g.setColor(Color.BLUE);
            g.fillOval(posX, posY, 50, 50);         
    }
        private int posX = -50;
        private int posY = -50;
        
    
    
        public int getPosX() {
                return posX;
        }
    
        public void setPosX(int posX) {
                this.posX = posX;
        }
    
        public int getPosY() {
                return posY;
        }
    
        public void setPosY(int posY) {
                this.posY = posY;
        }
    } 
    class test 
    {
     
            public static void main (String[] args)
            {
            	Fenetre fen = new Fenetre();
            }       
    }
    


    normalement au passage de la souris la couleur du bputon doit changer
    de même si je clique dessus, mais ... çà marche pas :s
    les images sont bien à la racine de mon projet pourtant!

    merci
    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2010 à 23:45:01

      Salut,
      d'après ce que t'as posté, ta classe Bouton dérive des MouseListeners, le problème c'est que tu as demandé à ton propre bouton de s'écouter lui-même, au lieu de demander à ta fenêtre d'écouter le bouton.
      Le bouton qui s'écoute lui même :
      public Bouton(String str){
                         // blabla
                         this.addMouseListener(this);
      }
      

      Ce que tu devrais faire pour ta fenêtre écoute ton bouton :
      public Fenetre(){
                  // Bla bla
                  this.addMouseListener(bouton);
                  go();
          }
      

      Cordialement.
      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2010 à 23:56:41

        c'est comment ca qu'on demande de faire dans le tuto :s
        en plus même en rendant la fenêtre l'objet observateur, çà change rien :s
        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2010 à 0:00:09

          Peut être un problème de "focus" alors ?
          Essaie les fonctions "requestFocus" et "setFocusable".
          Et puis positionne quelques System.out.println("machin") pour savoir quels évènements sont captés ou pas.
          Et au pire, ajoute ta fenêtre, ton panel, et même tous tes composants comme listeners de ton bouton, il doit bien y avoir l'un d'eux qui capte la souris, non? (-> méthode temporaire, pour voir ce qui fonctionne ou pas)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            6 décembre 2010 à 13:20:59

            Salut,

            Le bouton que tu instancies est un JButton. Utilise le constructeur de ta propre classe et ça devrait le faire.

            Attention toutefois aux objets se référençant eux-mêmes (ici le bouton qui est son propre listener). Garde bien en tête que, dans ce genre de cas, la libération de la mémoire par le garbage collector ne sera pas faite (sauf si Java 1.6 fait maintenant des merveilles, ce que je ne sais pas). Pour un bouton, ça ne pose pas de problèmes mais c'est un point à ne pas négliger dans d'autres cas.

            ++
            • Partager sur Facebook
            • Partager sur Twitter
              8 décembre 2010 à 13:02:17

              bonjour,
              exemple quand on passe la souris sur un JButton :

              public class BoutonTest extends javax.swing.JFrame {
                 javax.swing.JButton jButton1;
                 public BoutonTest(){
                    jButton1 = new javax.swing.JButton();
              
                    jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
                       public void mouseEntered(java.awt.event.MouseEvent evt) {
                          jButton1MouseEntered(evt);
                       }
                    });
                 }
                  private void jButton1MouseEntered(java.awt.event.MouseEvent evt) {
                     jButton1.setBackground(java.awt.Color.yellow);
                  }
                  public static void main(String args[]) {
                     new NewJFrame().setVisible(true);
                  }
              }
              
              • Partager sur Facebook
              • Partager sur Twitter

              mon bouton ne reagit pas aux evenements

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown