Faire interagir un bouton en Java

Résolu/Fermé
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 - 30 avril 2017 à 00:46
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 - 2 mai 2017 à 01:49
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

Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
Modifié le 30 avril 2017 à 01:49
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
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 6
30 avril 2017 à 02:16
Yes! ça marche :D
merci beaucoup
0
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 6
30 avril 2017 à 02:37
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?
0
Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
30 avril 2017 à 09:29
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
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 120
1 mai 2017 à 02:09
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).
0
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 6 > tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022
1 mai 2017 à 21:33
merci 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
0
KX Messages postés 16641 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 4 décembre 2022 2 984
1 mai 2017 à 12:41
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
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 6
2 mai 2017 à 01:49
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.
0
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 120
1 mai 2017 à 02:10
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.
0
Photoshoper Messages postés 88 Date d'inscription jeudi 11 décembre 2014 Statut Membre Dernière intervention 2 mai 2019 6
2 mai 2017 à 01:29
Bonsoir, tarek_dotzero
Dans le cas ou on utiliserai actionPerformed()
les autres syntaxe ne changeront pas?
0