Utilisation des listeners

Messages postés
10
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
8 août 2006
-
Messages postés
5367
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
27 janvier 2022
-
Bonjour a tous,

J'ai un petit soucis de conception:
J'ai un objet JPanel (on l'appellera gen) qui contient d'autres JPanel (p1 et p^2). Hors, sur p1, j'ai un bouton qui doit produire une action dans p2.
j'ai pensé a transmettre gen a p1 et p2 et meme de transmettre p1 a p2 et vice versa. Mais mon appli ne se résumant pas en seulement 2 panel, ca devient très vite compliqué...

J'ai voulu faire une classe contenant tous les listeners mais le problème que je rencontre c'est celui de savoir quel objet a déclenché le listener.
c'est véritablement un problème de conception des interfaces graphiques pour moi. Si vous avez une solution ou des questions... je reste a votre disposition.

Merci d'avance...

4 réponses

Messages postés
5367
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
27 janvier 2022
111
Salut,

pour savoir quel composant est séléctionné c'est assez simple, et vu
qu'un petit exemple est plus parlant qu'une longue explication :


import javax.swing.JButton;

import javax.swing.JPanel;

import javax.swing.JFrame;

import javax.swing.JOptionPane;


import java.awt.FlowLayout;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;


public class Test extends JFrame implements ActionListener{


    private JButton button1 = null;

    private JButton button2 = null;

    private JButton button3 = null;


    public Test(){

        super("Test Listener");

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        initButton();


        JPanel p = (JPanel) getContentPane();

        p.setLayout(new FlowLayout());

        p.add(button1);

        p.add(button2);

        p.add(button3);


        pack();

        setLocationRelativeTo(null);

    }


    private void initButton(){

        button1 = new JButton("Button 1");

        button2 = new JButton("Button 2");

        button3 = new JButton("Button 3");


        button1.addActionListener(this);

        button2.addActionListener(this);

        button3.addActionListener(this);

    }


    public void actionPerformed(ActionEvent e){

        //ici il y a plusieur ecoles perso j'ai choisi la mienne donc je ne retrerai dans une polemique

        Object src = e.getSource();

        if(src.equals(button1)){

            JOptionPane.showMessageDialog(this, "Clic sur le bouton 1 !");

        }else if(src.equals(button2)){

            JOptionPane.showMessageDialog(this, "Clic sur le bouton 2 !");

        }else if(src.equals(button3)){

            JOptionPane.showMessageDialog(this, "Clic sur le bouton 3 !");

        }

    }


    public static void main(String [] args){

        new Test().setVisible(true);

    }

   

}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Messages postés
10
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
8 août 2006
1
merci twinuts... Mais mon problème est que mes boutons ne sont pas dans les memes classes. Ici, ton actionperformed peut acceder a ton JButton mais moi il ne peux pas (a moins que je mettes le bouton en variable globale public et je pense pas que ce soit correct...
Si tu as une autre solution, je suis preneur!!!

merci d'avance
Messages postés
358
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
13 avril 2020

il faut utiliser le pattern MVC (modele vue control). la class modele extend de observable. dans tes class, tu implémentes l'interface observer. c'est à dire la méthode update. tu passeras à ces class une réfèrence sur la class modele. dans les méthodes updates tu apelleras les diverses méthodes de modele que tu auras créé. pour finir, tu ajouteras tes class comme obserevateur à modele, avec la commande addObserver.
Messages postés
5367
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
27 janvier 2022
111
En essayant tu aurais vite compris le truc :P :

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

import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Test extends JFrame {

    private MyPanel  panel1 = null;
     private MyPanel  panel2 = null;
    private MyAction action = null;

    public Test(){
        super("Test Listener");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        action = new MyAction(this);

        JPanel p = (JPanel) getContentPane();
        p.setLayout(new GridLayout(2, 1));

        add(getPanel1());
        add(getPanel2());
        pack();
        setLocationRelativeTo(null);
    }

    public MyPanel getPanel1(){
        if(panel1 == null){
            panel1 = new MyPanel("Bouton 1");
            panel1.getButton().addActionListener(action);
        }
        return panel1;
    }

    public MyPanel getPanel2(){
        if(panel2 == null){
            panel2 = new MyPanel("Bouton 2");
            panel2.getButton().addActionListener(action);
        }
        return panel2;
    }

    public static void main(String [] args){
        new Test().setVisible(true);
    }

}

class MyPanel extends JPanel{
    private JButton button = null;
   
    public MyPanel(String text){
        getButton().setText(text);
        add(getButton());
    }

    public JButton getButton(){
        if(button == null){
            button = new JButton();
        }
        return button;
    }
}

class MyAction implements ActionListener{
   
    private Test adaptee = null;
   
    public MyAction(Test adaptee){
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e){
        Object src = e.getSource();
        if(src instanceof JButton){//pas obligatoir mais ca aide pour simplifier un code
            JButton bt = (JButton) src;
            if(bt.equals(adaptee.getPanel1().getButton())){
                JOptionPane.showMessageDialog(adaptee, "Text = " + bt.getText());
            }else if(bt.equals(adaptee.getPanel2().getButton())){
                JOptionPane.showMessageDialog(adaptee, "Text = " + bt.getText());
            }
        }
    }
  
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA