Faire interagir un bouton en Java
Résolu
Photoshoper
Messages postés
106
Statut
Membre
-
Photoshoper Messages postés 106 Statut Membre -
Photoshoper Messages postés 106 Statut Membre -
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.
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
-
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(); } } -
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… -
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); } } -
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.