Partage
  • Partager sur Facebook
  • Partager sur Twitter

actionPerformed(ActionEvent evt) lié à un menu

Ouvrir des JInternalFrame dans une JDesktopPane

Sujet résolu
    21 novembre 2015 à 16:10:49

    Bonjour, 
    J'ai un projet à réaliser dans le cadre de mes études, je suis sur un projet qui est très simpliste.
    Je dois créer une application qui gère des médecins et des médicaments, comme ci-dessous.

    J'ai donc une fenêtre principale, celle présente et des JInternalFrame pour afficher les fenêtres en fonction du choix du menu. J'ai créé le menu et les JInternalFrame nécessaires, mais je n'arrive pas à faire fonctionner mon public void actionPerformed. Je vous joins le code de ma fenêtre principale "Application" :

    package gsb.tests;
     
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    import gsb.vue.JIFAjoutStock;
    import gsb.vue.JIFEchantillonStock;
    import gsb.vue.JIFMedecinCons;
    import gsb.vue.JIFMedecinListe;
    import gsb.vue.JIFMedicamentListe;
     
    public class Application extends JFrame implements ActionListener{
         
        private static final long serialVersionUID = 2591453837113855452L;
         
        protected JInternalFrame myJInternalFrame;
        protected JDesktopPane desktopPane;
         
         
        public Application(){
            super();
                     
            build();
        }
         
        private void build(){
            myJInternalFrame = new JInternalFrame();// pour affichage d'une seule JInternalFrame à la fois
             
            desktopPane = new JDesktopPane();
            desktopPane.setBackground(Color.lightGray);
            setContentPane(desktopPane);
             
             
             
             
            JMenuBar menuBar = new JMenuBar();
             
            JMenu menuMedecins = new JMenu("Medecins");
             
            JMenuItem medecinConsultation = new JMenuItem("Consultation Medecin");
            medecinConsultation.addActionListener(this); // installation d'un écouteur d'action
            menuMedecins.add(medecinConsultation);
            JMenuItem medecinListe = new JMenuItem("Liste Medecins");
            medecinListe.addActionListener(this); // installation d'un écouteur d'action
            menuMedecins.add(medecinListe);
     
            JMenu menuMedicaments = new JMenu("Medicaments");
            JMenuItem medicListe = new JMenuItem("Liste des Medicament");
            medicListe.addActionListener(this); // installation d'un écouteur d'action
            menuMedicaments.add(medicListe);
            JMenuItem medicStockEchant = new JMenuItem("Stock des Echantillons");
            medicStockEchant.addActionListener(this); // installation d'un écouteur d'action
            menuMedicaments.add(medicStockEchant);
            JMenuItem medicAjoutEchant = new JMenuItem("Ajouter des Echantillons");
            medicAjoutEchant.addActionListener(this); // installation d'un écouteur d'action
            menuMedicaments.add(medicAjoutEchant);
     
             
            menuBar.add(menuMedecins);
            menuBar.add(menuMedicaments);
             
             
            setJMenuBar(menuBar);
         
             
             
            setTitle("GSB"); //On donne un titre à l'application
            setSize(800,500); //On donne une taille à notre fenêtre
            setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
            setResizable(true); //On autorise la redimensionnement de la fenêtre
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
         
             
             
                 
             
             
        }
         
        public void actionPerformed(ActionEvent evt) {
            // TODO Raccord de méthode auto-généré
            if (evt.getSource() instanceof JMenuItem) {
            String ChoixOption = evt.getActionCommand();
     
                if (ChoixOption.equals("Consultation Medecin")) {
                    // Creation d'une sous-fenêtre
                    ouvrirFenetre(new JIFMedecinCons());
     
                } else if (ChoixOption.equals("Liste Medecins")) {
                    ouvrirFenetre(new JIFMedecinListe(this));
                }
            }
            if (evt.getSource() instanceof JMenuItem) {
                String ChoixOption = evt.getActionCommand();
     
                if (ChoixOption.equals("Liste des Medicament")) {
                    // Creation d'une sous-fenêtre
                    ouvrirFenetre(new JIFMedicamentListe(this));
     
                } else if (ChoixOption.equals("Stock des Echantillons")) {
                    //ouvrirFenetre(new JIFEchantillonStock());
     
                } else if (ChoixOption.equals("Ajouter des Echantillons")) {
                    //ouvrirFenetre(new JIFAjoutStock());
                }
            }
        }
         
        public void ouvrirFenetre(JInternalFrame uneFenetre) {
     
            myJInternalFrame.dispose(); // si une fenêtre était dejà affichée, elle
                                        // est libérée
            myJInternalFrame = uneFenetre;
            myJInternalFrame.setVisible(true);
            myJInternalFrame.setResizable(false);
            myJInternalFrame.setMaximizable(true);
            myJInternalFrame.setClosable(true);
            myJInternalFrame.setSize(480, 380);
            desktopPane.add(myJInternalFrame);
            myJInternalFrame.setVisible(true);
        }
         
         
         
    }



    Et je vous joins une de mes classes qui est censée apparaître après un clic, ici sur "Liste des Médicaments" sur menu "Médicament".

    package gsb.vue;
     
    import gsb.modele.Medicament;
    import gsb.modele.dao.MedicamentDao;
    import gsb.tests.Application;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
     
     
    import javax.swing.JButton;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
     
    /**
     * @author Isabelle
     * 3 mars 2015
     * TODO Pour changer le modèle de ce commentaire de type généré, allez à :
     * Fenêtre - Préférences - Java - Style de code - Modèles de code
     */
    public class JIFMedicamentListe extends JInternalFrame implements ActionListener {
        private static final long serialVersionUID = 1L;
     
        private ArrayList<Medicament> lesMedicaments;
     
     
        protected JPanel p;
        protected JScrollPane scrollPane; //salut c'est moi moumou la reine des mouettes
        protected JPanel pSaisie;
        protected JTextField JTdepotLegal;
        protected JButton JBafficherFiche;
        protected Application fenetreContainer;
         
     
        public JIFMedicamentListe(Application uneFenetreContainer) {
         
            fenetreContainer = uneFenetreContainer;
            // récupération des données Medecin dans la collection
            lesMedicaments = MedicamentDao.retournerCollectionDesMedicaments();
     
            int nbLignes = lesMedicaments.size();
     
            JTable table;
             
             
     
            p = new JPanel(); // panneau principal de la fenêtre
     
            int i=0;
            String[][] data = new String[nbLignes][4] ;
            for(Medicament unMedicament : lesMedicaments){
                data[i][0] = unMedicament.getDepotLegal();
                data[i][1] = unMedicament.getNomCommercial();
                data[i][2] = unMedicament.getLibelleFamille();
                i++;
                }
            String[] columnNames = {"Code", "Nom Commercial","Libelle Famille"};
            table = new JTable(data, columnNames);
             
            scrollPane = new JScrollPane(table);
            scrollPane.setPreferredSize(new Dimension(400, 200));
            p.add(scrollPane);
             
            pSaisie = new JPanel();
            JTdepotLegal = new JTextField(20);
            JTdepotLegal.setMaximumSize(JTdepotLegal.getPreferredSize());
            JBafficherFiche = new JButton("Afficher Fiche médicament");
            JBafficherFiche.addActionListener(this);
            pSaisie.add(JTdepotLegal);
            pSaisie.add(JBafficherFiche);
            p.add(pSaisie);
             
            // mise en forme de la fenêtre
            Container contentPane = getContentPane();
            contentPane.add(p);
             
             
        }
     
        /* (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        @Override
        public void actionPerformed(ActionEvent arg0) {
            Object source = arg0.getSource();
            if (source == JBafficherFiche){
                Medicament unMedicament = MedicamentDao.rechercher(JTdepotLegal.getText());
                if (unMedicament!=null){
                    fenetreContainer.ouvrirFenetre(new JIFMedicamentCons());
                }
            }  
        }
         
    }


    Merci de bien vouloir m'aider.
    Pushed

    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2015 à 9:50:47

      Salut,

      Je te conseille plutot de faire :

      medecinConsultation.addActionListener ((new ActionListener() {
       public void actionPerformed(ActionEvent e) {
        //Action sur e
       }
      });
      

      Dans ta fonction build. Ça sera bien plus clair que des actionPerformed tout seuls, avec des tonnes de instanceof (pas très propre) ;)

      Tu aura un ActionListener pour chaque Item bien entendu !

      • Partager sur Facebook
      • Partager sur Twitter
        24 novembre 2015 à 16:10:53

        Bonjour BabC, 

        Je vais essayer ça car effectivement des if et des instanceof pour chaque item c'est pas propre mais notre prof nous apprend seulement comme ça malheureusement. :'(
        Je te tiens au courant !

        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2015 à 19:17:11

          Salut BabC, ça fonctionne parfaitement, j'avais une autre question mais ce n'est pas le même problème, dois-je créer un nouveau sujet ?
          (Cela concerne le même projet)

          -
          Edité par Pushed 27 novembre 2015 à 19:26:16

          • Partager sur Facebook
          • Partager sur Twitter
            30 novembre 2015 à 9:32:04

            C'est toujours mieux de fermer ce topic en le mettant résolu et d'en ouvrir un autre (lisibilité, recherche pour les futurs utilisateurs toussa toussa ^^ )

            Content que ça marche en tout cas =)

            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2015 à 9:58:08

              Il faut voir les ActionListener comme des actions à exécuter en cas d'événement.
              Si tu affectes le même ActionListener à chacun des éléments, alors tu vas effectuer la même action à chaque fois... et après tu es obligé de distinguer les éléments ne manière pas très élégante.

              La solution de BabC de définir 1 ActionListener par élément est la meilleure solution.
              Tu peux faire ça plus joliement avec les lambda ou même les méthodes référence :

              class Controller {
              	void init() {
              		button1.addActionListener(this::onClickButton1);
              		button2.addActionListener(this::onClickButton2);
              	}
              
              	void onClickButton1(ActionEvent e) {
              		// ...
              	}
              	void onClickButton2(ActionEvent e) {
              		// ...
              	}
              }
              • Partager sur Facebook
              • Partager sur Twitter
              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)

              actionPerformed(ActionEvent evt) lié à un menu

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown