Faire interagir un bouton en Java

Résolu
Salut tout le monde j’espère que vous allez bien?
J’étais en train de m'exercer en Java quand j'ai rencontre ce petit problème.

Voilà j'ai voulus mettre une action sur mon JButton bouton, après des recherche j'ai vue que cela est possible avec l'objet MouseListener. J'ai tenté tans que mal à le faire mais cela ne marche toujours pas voici le code de ma classe j’espère que vous apporterais une solution à mon problème en me montrant la bonne syntaxe.

import java.awt.BorderLayout;
import java.awt.event.MouseWheelListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements MouseWheelListener{
  private JPanel pan = new JPanel();
  private JButton bouton = new JButton("Mon bouton");

  public Fenetre(){
    this.setTitle("Animation");
    this.setSize(300, 150);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    
    
  //On définit le layout à utiliser sur le content pane
    this.setLayout(new BorderLayout());
    //Ajout du bouton à notre content pane
    //pan.add(bouton);
    this.getContentPane().add(bouton, BorderLayout.EAST);
    this.setVisible(true);
    
    bouton.addMouseListener(bouton);
    
  }       
}

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Voici la correction :
    import java.awt.BorderLayout;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Fenetre extends JFrame implements MouseListener {
      private JPanel  pan    = new JPanel();
      private JButton bouton = new JButton("Mon bouton");
    
      public Fenetre() {
        this.setTitle("Animation");
        this.setSize(300, 150);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        
        //On définit le layout à utiliser sur le content pane
        this.setLayout(new BorderLayout());
        //Ajout du bouton à notre content pane
        //pan.add(bouton);
        this.getContentPane().add(bouton, BorderLayout.EAST);
        this.setVisible(true);
        
        bouton.addMouseListener(this);
        
      } 
      
      public void mouseClicked(MouseEvent e) {
          System.out.println("Parfait :-)");
      }
    
      public void mousePressed(MouseEvent e)  {}
      public void mouseEntered(MouseEvent e)  {}
      public void mouseExited(MouseEvent e)   {}
      public void mouseReleased(MouseEvent e) {}
    }


    Et :

    import javax.swing.JFrame;
    
    public class Principal {
        public static void main(String arguments[]) {
            JFrame fenetre = new Fenetre();
        }
    }
    1. Yes! ça marche :D
      merci beaucoup
    2. dans le cas ou je fais une autre action dans un bouton différent mais dans la même class...
      ça serai différent n'est s'pas?
  2. Mais de rien.

    Si tu utilises plusieurs boutons dans ce cas tu dois jouer avec l'objet « e » MouseEvent pour déterminer de quel bouton il s'agit…
    1. Plus précisément :

        public void mouseClicked(MouseEvent e) {
            JButton source = (JButton)e.getSource();
            if(source == bouton1){
                //
            }else if(source == bouton2){
                //
            }
        }
      


      On peut utiliser == car on est sûre qu'il s'agit "exactement" du même objet (même adresse).
    2. @tarek_dotzeromerci beaucoup j'ai fais à peux prêt la même choses
      ta syntaxe semble être plus propre, je crois bien que je vais l'utiliser
  3. Modérateur
    Bonjour,

    J'aimerais quand même rajouter un point (tant qu'on y est...)

    extends JFrame implements MouseWheelListener
    est maladroit car ça fait une classe qui fait tout et n'importe quoi, sans séparation des rôles.
    addMouseListener(this);
    c'est un peu comme un pompier pyromane qui serait à la fois celui qui allume le feu et celui qui va l'éteindre...

    La fenêtre est là pour générer un ensemble d’événements et le listener pour traiter un événement en particulier.
    Mais une classe qui est à la fois fenêtre et gestionnaire d'événements c'est incorrect d'un point de vue conception objet, d'autant plus que les événements ici ne concernent que le bouton, pas la fenêtre en elle même.

    Exemple de correction avec des classes anonymes :

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Fenetre extends JFrame {
        private static final long serialVersionUID = 1L;
    
        private final JButton bouton;
    
        public Fenetre() {
            setTitle("Animation");
            setSize(300, 150);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setLayout(new BorderLayout());
    
            bouton = new JButton("Mon bouton");
    /*
            bouton.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("MouseAdapter : " + e);
                }
            });
    */
            bouton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("ActionListener : " + e);
                }
            });
    
            add(bouton, BorderLayout.EAST);
    
            setVisible(true);
        }
    }

    NB. On n'a plus besoin de regarder e.getSource() car on ajoute le listener directement au bouton qui doit le récupérer et non plus à la fenêtre.

    Remarque : on peut aussi le faire avec des classes internes.

            bouton = new JButton("Mon bouton");
            bouton.addActionListener(new BoutonActionListener());
            add(bouton, BorderLayout.EAST);
            setVisible(true);
        }
    
        private final class BoutonActionListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("ActionListener : " + e);
            }
        }
    }

    Et depuis Java 8 on peut utiliser une lambda expression :

            bouton = new JButton("Mon bouton");
            bouton.addActionListener(e ->
                    System.out.println("ActionListener : " + e));
            add(bouton, BorderLayout.EAST);
    
            setVisible(true);
        }
    }

    Ou une référence de méthode :

            bouton = new JButton("Mon bouton");
            bouton.addActionListener(this::boutonActionListener);
            add(bouton, BorderLayout.EAST);
    
            setVisible(true);
        }
    
        private void boutonActionListener(ActionEvent e) {
            System.out.println("ActionListener : " + e);
        }
    }
    1. Merci KX,
      ça n'a pas été facile mais j'ai finis par comprendre ton code.
      Je dois reconnaître qu'il est plus ordonné et plus clair, j'aimerais bien programmer de la sorte.
  4. Bonjour,

    Je veux ajouter une seule chaose : dans le cas des boutons, on préfère, généralement, l'utilisation de ActionListener qui a une seule méthode actionPerformed() et non pas 5 comme MouseListener.

    Mais, puisque ça marche alors passez à autre chose.

    Bon Courage.
    1. Bonsoir, tarek_dotzero
      Dans le cas ou on utiliserai actionPerformed()
      les autres syntaxe ne changeront pas?