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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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