Utiliser ActionListener en dehors la classe ou il est implémenté

Résolu
deli2025 Messages postés 40 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 4 mai 2020 - 23 août 2012 à 11:14
deli2025 Messages postés 40 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 4 mai 2020 - 23 août 2012 à 13:15
Bonjour, je suis débutant en Java et j'ai encore du mal avec la POO...

J'ai un programme qui ce compose comme ceci :

- Class MonProgramme (main)
- Class Fenetre
- Class Container
- Class Menu

Pour l'instant, je gère les action du menu dans la Class Menu mais je souhaiterais le faire dans la Class MonProgramme...

Voici le code de ma Class Menu :

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

/**
 *
 * @author d3l1
 */
public class Menu extends JMenuBar implements ActionListener
{
    private JMenuBar  menu        = new JMenuBar();
    private JMenu     fichier     = new JMenu("Fichier");
    private JMenuItem nouveau     = new JMenuItem("Nouveau");
    private JMenuItem charger     = new JMenuItem("Charger");
    private JMenuItem sauvegarder = new JMenuItem("Sauvegarder");
    private JMenuItem quitter     = new JMenuItem("Quitter");
    
    private JMenu     parametres  = new JMenu("Paramètres");   
    private JMenuItem pause       = new JMenuItem("Pause");
    private JMenuItem reprendre   = new JMenuItem("Reprendre");
    private JMenuItem resolution  = new JMenuItem("Résolution");
            
    private JMenu     aide        = new JMenu("Aide");   
    private JMenuItem manuel      = new JMenuItem("Manuel");
    private JMenuItem apropos     = new JMenuItem("À propos");
    
    public Menu()
    {
        /*
         *  Ajout des éléments du menu
         */
        this.menu.add(fichier);
        this.menu.add(parametres);
        this.menu.add(aide);
        
        /*
         *  Ajout des éléments de l'onglet fichier
         */
        this.fichier.add(nouveau);
        this.fichier.add(charger);
        this.fichier.add(sauvegarder);
        this.fichier.add(quitter);
        
        this.parametres.add(pause);
        this.parametres.add(reprendre);
        this.parametres.add(resolution);
        
        this.aide.add(manuel);
        this.aide.add(apropos);
        
        /*
         *  Ajout du menu
         */
        this.menu.add(fichier);
        this.menu.add(parametres);
        this.menu.add(aide); 
        
        /*
         * Active l'écoute des onglets
         */ 
        this.nouveau.addActionListener(this);
        this.charger.addActionListener(this);
        this.sauvegarder.addActionListener(this);
        this.quitter.addActionListener(this);
        
        this.pause.addActionListener(this);
        this.reprendre.addActionListener(this);
        this.resolution.addActionListener(this);

        this.manuel.addActionListener(this);
        this.apropos.addActionListener(this);
    }
    
    public JMenuBar getMenuBar() 
    {
        return menu;
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object source = e.getSource();
        
        /*
         * Onglet Fichier
         */
        if(source == nouveau)
        {
            System.out.println("Action de l'onglet : Nouveau");
        }
        if(source == charger)
        {
            System.out.println("Action de l'onglet : Charger");
        }
        if(source == sauvegarder)
        {
            System.out.println("Action de l'onglet : Sauvegarder");
        }
        if(source == quitter)
        {
            System.exit(0);    
        }
        
         /*
         * Onglet Paramètres
         */
        if(source == pause)
        {
            System.out.println("Action de l'onglet : Pause");
        }
        if(source == reprendre)
        {
            System.out.println("Action de l'onglet : Reprendre");
        }
        if(source == resolution)
        {
            System.out.println("Action de l'onglet : Résolution");
        }
        
         /*
         * Onglet Aide
         */
        if(source == manuel)
        {
            System.out.println("Action de l'onglet : Manuel");
        }
        if(source == apropos)
        {
            System.out.println("Action de l'onglet : A propos");
        }
    }
    
}


Et voici le code de la Class MonProgramme :
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cossacks;

/**
 *
 * @author d3l1
 */
public class Cossacks
{   
    private Fenetre fenetre      = new Fenetre();
    private Container container  = new Container();
    private Menu menu            = new Menu();
    
    public Cossacks()
    {
        fenetre.setContentPane(container);
        fenetre.setJMenuBar(menu);
        fenetre.setJMenuBar(menu.getMenuBar());
        fenetre.setVisible(true);
    }

    public static void main(String[] args) 
    { 
        new Cossacks();
    } 
}



J'ai essayer d'implémenter ActionListener ou item dans cette classe mais rien n'y fait...

Si quelqu'un pouvais m'éclairer sur la manière d'y parvenir... J'apprécierais.

2 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
23 août 2012 à 11:31
Salut,

C'est toujours une très mauvaise idée d'implémenter un actionListener dans la classe où il est utilisé. Ca t'oblige à récupérer la source et à faire une suite de if(source.equals(bouton)...

Le mieux est de créer une nouvelle classe
public class PauseListener implements ActionListener {

   public PauseListener(){
      super();
   }

   @Override
   public void actionPerformed(ActionEvent e){
      System.out.println("Action de l'onglet : Pause");
   }

}

public class NouveauListener implements ActionListener {

   public NouveauListener (){
      super();
   }

   @Override
   public void actionPerformed(ActionEvent e){
      System.out.println("Action de l'onglet : Nouveau");
   }

}


Tu fais ca pour toutes tes actions et au lieu de faire :
this.nouveau.addActionListener(this);

tu fais :
this.nouveau.addActionListener(new NouveauListener());


Et de cette manière, tu peux utiliser à deux endroits le même listener.

Si tu utilises un menu, je te conseil d'affecter tous tes listener au menu et ensuite, quand tu créé un bouton de lui donner le modele de ton menuitem :
bouton.setModel(menuItem.getModel()); 
3
deli2025 Messages postés 40 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 4 mai 2020
23 août 2012 à 13:15
Merci
0
Rejoignez-nous