IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Exception in thread "main" java.lang.StackOverflowError


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut Exception in thread "main" java.lang.StackOverflowError
    Bonjour ,

    Exception in thread "main" java.lang.StackOverflowError

    J'obtiens ce message sur un petit programme de test.Je veux juste pour clarifier mon code gérer les événements dans une classe indépendante de ma classe principale .
    voici le code de la classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    // Creation d'une fenetre et test d'une classe listener indépendante
     
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
     
    class Fenetre extends JFrame
    {
        // Les attributs
    	 JMenu Fichier ;
    	 JMenuItem Ouvrir ; 
    	 JMenuBar Menubar ;
     
    	 // Pour gérer les evnts on a besoin d'une instance de Gestion_Fenetre 
     
    	Gestion_Fenetre  mon_Gestion_Fenetre ;
     
     
    	 // Le constructeur
     
    	 public Fenetre()
    	 {
    	 mon_Gestion_Fenetre = new Gestion_Fenetre();
    	 Menubar = new JMenuBar();
    	 this.setJMenuBar(Menubar) ;
    	 Fichier = new JMenu("Fichier") ;
    	 Ouvrir = new JMenuItem("Ouvrir") ;
    	 Fichier.add(Ouvrir) ;
    	 Menubar.add(Fichier);
    	 Ouvrir.addActionListener(mon_Gestion_Fenetre);
    	 this.setVisible(true);
    	 this.setSize(400,400);
    	 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	 }
     
    	 // Les méthodes
     
     
    } // Fin de la classe Fenetre
     
    // La classe de Test
     
    public class Test_Fenetre
    {
     
       public static void main (String []argv)
    	{
    	Fenetre essai = new Fenetre() ;
    	}
    } // Fin de ma classe de test
    Et voici le code de ma classe qui gére les événements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /* Pour gérer les événements par rapport à notre fenetre
     On crée une classe à part chargée de gérer les événements
     cette classe hérite de java.evnt et est implémentée dans la 
     classe principale */
     
    import java.awt.event.* ;
     
     
     
     class Gestion_Fenetre implements ActionListener
     {
         // Les attributs
    	  //ActionEvent e ;
    	  Fenetre essai ; 	  
    	  // Le constructeur
     
    	  public Gestion_Fenetre ()
    	  {
    	  essai = new Fenetre() ;
    	  } // Fin du constrcteur  
     
     
    	  // Les méthodes
     
    		 // Cette classe ne fait qe redéfinir la méthode ActionPerformed
     
    		 public void actionPerformed (ActionEvent e)
    		 {
     
    		     if ( e.getSource() ==essai.Ouvrir )
    			  System.out.println("Le test a réussi ");
     
    		 } // fin de la redéfinition
     
     
    }// Fin de ma classe
    D'après les recherches que j'ai faite,le message indiquerai que le programme effectue ne boucle infinie,mais où est l'erreur.

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    Ton constructeur Fenetre fait un new Gestion_Fenetre et ton constructeur Gestion_Fenetre, appellé par Fenetre, fait un new Fenetre, et ton constructeur Fenetre, appellé par Gestion_Fenetre, fait un new Gestion_Fenetre, et ainsi de suite à l'infini...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Merci pour la rapidité de la réponse.

    En supprimant le constructeur de ma classe qui gére les événements je n'ai pls de message d'erreur stackOverflowError, mon affichage se fait bien mais lorsqe je teste l'action en cliquant sur le bouton Ouvrir j'ai le message :

    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    at Fenetre.<init>(Test_Fenetre.java:23)
    at Gestion_Fenetre.<init>(Test_Gestion_Fenetre.java:19)
    Mon problème est comment faire savoir à ma classe qui gére les événements à quoi correspond le JMenuItem Ouvrir de la classe principale.

    Je ne sais pas si j'ai été clair.

    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    J'ai pas compris...

    Repost le source de tes classes histoire de voir réellement les modif que t'as faites.
    C'est quoi ce "message"? D'où vient-il? C'est une erreur ou un reste du précédent stakOverFlow?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Merci d'avance,j'ai mis un constructeur vide dans ma classe gérant les événements.

    Voici la classe qui gére les évnts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    /* Pour gérer les événements par rapport à notre fenetre
     On crée une classe à part chargée de gérer les événements
     cette classe hérite de java.evnt et est implémentée dans la 
     classe principale */
     
    import java.awt.event.* ;
    import java.awt.*;
    import javax.swing.*;
     
     
     
     class Gestion_Fenetre implements ActionListener
     {
         // Les attributs
    	  //ActionEvent e ;
    	  Fenetre essai ; 	  
    	  // Le constructeur
     
     
    	  public Gestion_Fenetre ()
    	  {
    	  //essai = new Fenetre() ;
    	  } // Fin du constrcteur  
     
     
    	  // Les méthodes
     
    		 // Cette classe ne fait qe redéfinir la méthode ActionPerformed
     
    		 public void actionPerformed (ActionEvent e)
    		 {
     
    		     if (e.getSource()==essai.Ouvrir)
    			  System.out.println("Le test a réussi ");
     
    		 } // fin de la redéfinition
     
     
    }// Fin de ma classe
     
    // Ma classe de test
     
    /*public class Test_Gestion_Fenetre
    {
      
       public static void main (String []argv)
    	{
    	Gestion_Fenetre  essai = new Gestion_Fenetre() ;
    	}
     
    } // Fin de la classe de test
    Voici ma classe principale où rien n'a changé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    // Creation d'une fenetre et test d'une classe listener indépendante
     
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
     
    class Fenetre extends JFrame
    {
        // Les attributs
    	 JMenu Fichier ;
    	 JMenuItem Ouvrir ; 
    	 JMenuBar Menubar ;
     
    	 // Pour gérer les evnts on a besoin d'une instance de Gestion_Fenetre 
     
    	Gestion_Fenetre  mon_Gestion_Fenetre ;
     
     
    	 // Le constructeur
     
    	 public Fenetre()
    	 {
    	 mon_Gestion_Fenetre = new Gestion_Fenetre();
    	 Menubar = new JMenuBar();
    	 this.setJMenuBar(Menubar) ;
    	 Fichier = new JMenu("Fichier") ;
    	 Ouvrir = new JMenuItem("Ouvrir") ;
    	 Fichier.add(Ouvrir) ;
    	 Menubar.add(Fichier);
    	 Ouvrir.addActionListener(mon_Gestion_Fenetre);
    	 this.setVisible(true);
    	 this.setSize(400,400);
    	 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	 }
     
    	 // Les méthodes
     
     
    } // Fin de la classe Fenetre
     
    // La classe de Test
     
    public class Test_Fenetre
    {
     
       public static void main (String []argv)
    	{
    	Fenetre essai = new Fenetre() ;
    	}
    } // Fin de ma classe de test
    La compilation se fait sans erreur,à l'execution j'ai bien mon affichage mais lorsque je teste le menu Ouvrir j'ai le message d'érreur plus haut .Donc j'ai aussi des doutes sur ma redéfinition de la méthode actionPerformed.

    Merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    Utilise le debug mode si tu peux (si tu n'utilise pas notepad).

    Voici comment Netbeans écrit le code sur le clic d'un JMenuItem chez moi :

    Home.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public class Home extends JFrame {
      private JMenuBar menuBar;
      private JMenuItem communityMenuItem;
     
      private static Home instance;
      public static Home getInstance() {
        if (intance == null) {
          instance = new Home();
        }
      }
     
      private Home() {
        initComponents();
        ...
      }
     
      private void initComponents() {
        menu = new javax.swing.JMenuBar();
        ...
        communityMenuItem = new javax.swing.JMenuItem();
        ...
        communityMenuItem.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            communityMenuItemActionPerformed(evt);
          }
        });
      }
     
      private void communityMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
        try {
          // Pour ouvrir une fenêtre JInternalFrame de type Community
          Community community = Community.getInstance();
          this.add(community);
          community.setVisible(true);
        } catch (PapoException pe) {
          pe.printStackTrace();
        }
      }
    ...
    }
    Comme tu le vois je déclare la réaction du clic sur mon JMenuItem à l'intérieur de la classe de la JFrame. Pourquoi? Parce que pour moi cette méthode est spécifique au fonctionnement de ma JFrame Home.

    PS: Toutes mes fenêtres son des singletons car sinon, chaque appelle à new Home() créerait une nouvelle fenêtre, ce que je ne veux pas.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Voilà où j'en suis,le message d'erreur provenait de la redéfinition de actionPerformed.

    Voici le code qui me donne l'erreur à l'execution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    		 public void actionPerformed (ActionEvent e)
    		 {
    		 // Il faut caster l'object
    		 JMenuItem target =(JMenuItem)e.getSource(); 
     
    		     if (target==essai.Ouvrir)
    			  System.out.println("Le test a réussi ");
     
    		 } // fin de la redéfinition
    Et voici le code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		 public void actionPerformed (ActionEvent e)
    		 {
    		 // Il faut caster l'object
    		 JMenuItem target =(JMenuItem)e.getSource(); 
    		  String actionCommand =target.getActionCommand();
           if(actionCommand.equals("Ouvrir")) 
     
     
    			  System.out.println("Le test a réussi ");
     
    		 } // fin de la redéfinition
    quelle est la différence entre getSource() et getActionCommand() ?

    Merci

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    Tu comptes faire un if dans ton actionPerformed pour chaque JMenuItem?

    L'intérêt de déclarer les actionPerformed encapsuler dans l'instance du listener c'est de justement ne pas avoir a faire tout plein de test pour savoir sur quoi on a cliquer et comment réagir alors, parce que seul le composant a qui appartient le listener pourra accéder à cet actionPerformed.

    Par contre il est interressant d'externaliser les composants eux-même.

    Au début en Java on a tendance a regrouper les bouts de code qui se ressemble parce que çà semble "plus simple" de n'avoir qu'une seul méthode qui fait plein de chose que plein de méthodes qui font plus ou moins la même chose mais au final çà devient surtout ingérable, inmaintenable et illisible.

    Enfin, c'est juste un conseil. Pour apprendre ton code est interressant car il éclairci les mécanismes.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Par défaut
    getSource() te renvoie l'objet qui à crée l'évènement (à savoir le JMenuItem ouvrir dans ton cas).
    getActionCommand() te renvoie le texte associé à l'action (qui ici est initialisé par défaut à la valeur String de l'objet appelant : ouvrir).

    Le problème que tu avais en utilisant e.getSource() est que tu ne pouvais pas le comparer avec l'objet ouvrir car ton listener se trouve dans une classe séparée de celle de ta fenêtre ou est défini l'objet ouvrir.
    Une solution à ça est dans l'exemple de code de Michael, accéder à l'instance de ta fenêtre de façon statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class Fenetre extends JFrame {
     
      private static Home instance;
     
      public static Home getInstance() {
        if (instance == null) {
          instance = new Home();
        }
        return instance;
      }
     
      public Fenetre() {
         super();
         instance = this;
         ....
      }
    }
    ce qui te donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
    public class Fenetre extends JFrame{
     
        private static Fenetre instance;
        public static Fenetre getInstance() {
            if (instance==null) return new Fenetre();
            else return instance;
        }
     
        JMenuBar menuBar = new JMenuBar();
        JMenu menuFichier = new JMenu("Fichier");
        JMenuItem ouvrir = new JMenuItem("Ouvrir");
        JMenuItem quitter = new JMenuItem("Quitter");
        JLabel monLabel = new JLabel("TEST");
     
        public Fenetre() {
            super();
            instance = this;
            setTitle("Ma fenetre");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(800,600);
     
            ouvrir.addActionListener(new MonActionListener());
            quitter.addActionListener(new MonActionListener());
            menuFichier.add(ouvrir);
            menuFichier.add(quitter);
            menuBar.add(menuFichier);
            setJMenuBar(menuBar);
     
            getContentPane().add(monLabel);
            setVisible(true);
        }
     
    }
    et pour ton listener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    import java.awt.event.*;
     
    public class MonActionListener implements ActionListener {
     
        public void actionPerformed(ActionEvent e) {
     
            Fenetre instance = Fenetre.getInstance();
     
            if (e.getSource().equals(instance.ouvrir)) {
                instance.monLabel.setText("Ouverture de fichier ..");
            }
            if (e.getSource().equals(instance.quitter)) {
                System.exit(0);
            }
     
        }
     
    }

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    DoGet, tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private static Fenetre instance;
        public static Fenetre getInstance() {
            if (instance==null) return new Fenetre();
            else return instance;
        }
    instance vaudra toujours null donc tu retournera toujours une nouvelle instance de Fenetre()

    Le bon code est comme celui que j'ai mis
    En retournant instance tu t'assures qu'il soit toujours rempli

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Par défaut
    en fait j'avais pas vu ton constructeur en private, dans mon exemple le constructeur est public et initialise instance a this.
    de fait ça marche mais on perd l'unicité de la Fenetre.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    Ben le truc c'est que si il clic plusieurs fois, il reinitialisera toute la fenêtre à chaque fois et perdra donc tout état

    Enfin maintenant, çà dépend de ce qu'il veut faire mais faire des new "coûte", donc il vaut mieux optimiser.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Bonjour,

    L'intérêt de déclarer les actionPerformed encapsuler dans l'instance du listener c'est de justement ne pas avoir a faire tout plein de test pour savoir sur quoi on a cliquer et comment réagir alors, parce que seul le composant a qui appartient le listener pourra accéder à cet actionPerformed.
    En effet je ne voyais pas les choses de cette façon.
    Quelle est la façon la plus simple et la plus claire de coder(et peut être la plus professinnelle) classe interne ou externe.

    Le problème que tu avais en utilisant e.getSource() est que tu ne pouvais pas le comparer avec l'objet ouvrir car ton listener se trouve dans une classe séparée de celle de ta fenêtre ou est défini l'objet ouvrir.
    Tu as parfaitement compris mon problème .Je vais tester l'utilisation d'une méthode getInstance().
    Quelle est la différence entre une méthode getInstance() qui retourne une instance et la méthode fenetre instance = new fenetre() qui pour moi crée une instance il y a surement des subtilités que je n'ai pas compris.

    Merci

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Par défaut
    La méthode getInstance que je propose renvoi une instance, oui, mais pas une nouvelle a chaque fois, mais la même!! Si tu appelle 1000 fois getInstance() tu n'aura qu'une seule instance unique.

    C'est ce qu'on appelle un pattern singleton. (Google peux t'aider).

    new Fenetre() crée une nouvelle instance a chaque fois!

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 354
    Par défaut
    Ok Merci,
    Je vais faire une petite recherche sur le "pattern singleton".
    par contre peux tu m'expliquer ceci sur un exemple :

    Par contre il est interressant d'externaliser les composants eux-même
    Finalement j'ai réussi à utiliser ma classe externe sans passer par une méthode getInstance, en faisant deux modifs dans mes codes précédents.
    Peux tu me dire quelle est la méthode la plus propre.Après je pourrais fermer le post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     class Fenetre extends JFrame
    {
        // Les attributs
    	 JMenu Fichier ;
    	 JMenuItem Ouvrir ; 
    	 JMenuBar Menubar ;
    	 
    	 // Pour gérer les evnts on a besoin d'une instance de Gestion_Fenetre 
    	 
    	Gestion_Fenetre  mon_Gestion_Fenetre ;
    	
    	// Appel à la boite de dialogue
    	
    
    
    	 
    	 // Le constructeur
    	 
    	 public Fenetre()
    	 {
    	 mon_Gestion_Fenetre = new Gestion_Fenetre(this);//Ajout
    	 Menubar = new JMenuBar();
    	 this.setJMenuBar(Menubar) ;
    	 Fichier = new JMenu("Fichier") ;
    	 Ouvrir = new JMenuItem("Ouvrir") ;
    	 Fichier.add(Ouvrir) ;
    	 Menubar.add(Fichier);
    	 Ouvrir.addActionListener(mon_Gestion_Fenetre);
    	 this.setVisible(true);
    	 this.setSize(400,400);
    	 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	 }
    	 
    	 
    	 // Les méthodes
    	 
    	 
    	 
    } // Fin de la classe Fenetre
    
    // La classe de Test
    
    public class Test_Fenetre
    {
    
       public static void main (String []argv)
    	{
    	Fenetre essai = new Fenetre() ;
    	}
    } // Fin de ma classe de test
    MLa classe qui gère les events

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Gestion_Fenetre implements ActionListener
     {
         // Les attributs
    	  //ActionEvent e ;
    	  Fenetre essai  ;
    	  // Le constructeur
    	  
    
    	  public Gestion_Fenetre (Fenetre essai)
    	  {
    	  this.essai = essai ;// J'ai rajouté ceci 
    	 
    	  } // Fin du constrcteur  
    	  
    	  // Les méthodes
    	    
    		 // Cette classe ne fait qe redéfinir la méthode ActionPerformed
    		 
    		 public void actionPerformed (ActionEvent e)
    		 {
    		 // Il faut caster l'object
    		 JMenuItem target =(JMenuItem)e.getSource(); 
       if (target==essai.Ouvrir)
       {
    			System.out.println("Le test a réussi ");
    	}		  		 
    		 } // fin de la redéfinition
    		 
    	  
    }// Fin de ma classe
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException ?
    Par freezerhm dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 04/12/2007, 09h26
  2. Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Par Trint dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 27/02/2007, 11h28
  3. Réponses: 8
    Dernier message: 11/05/2006, 19h32
  4. [JDIC]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Par kedare dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 06/05/2006, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo