# Java > Interfaces Graphiques en Java > AWT/Swing >  Exception in thread "main" java.lang.StackOverflowError

## une_tite_question

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 grer les vnements dans une classe indpendante de ma classe principale .
*voici le code de la classe principale* :



```

```

*Et voici le code de ma classe qui gre les vnements*



```

```

D'aprs les recherches que j'ai faite,le message indiquerai que le programme effectue ne boucle infinie,mais o est l'erreur.

Merci

----------


## MichaelBW

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...  ::king::

----------


## une_tite_question

Merci pour la rapidit de la rponse.

En supprimant le constructeur de ma classe qui gre les vnements 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 problme est comment faire savoir  ma classe qui gre les vnements  quoi correspond le JMenuItem Ouvrir de la classe principale.

Je ne sais pas si j'ai t clair.

Merci

----------


## MichaelBW

J'ai pas compris...

Repost le source de tes classes histoire de voir rellement les modif que t'as faites.
C'est quoi ce "message"? D'o vient-il? C'est une erreur ou un reste du prcdent stakOverFlow?  ::roll::

----------


## une_tite_question

Merci d'avance,j'ai mis un constructeur vide dans ma classe grant les vnements.

Voici la classe qui gre les vnts :



```

```

Voici ma classe principale o rien n'a chang



```

```

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 redfinition de la mthode actionPerformed.

Merci

----------


## MichaelBW

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


```

```

Comme tu le vois je dclare la raction du clic sur mon JMenuItem  l'intrieur de la classe de la JFrame. Pourquoi? Parce que pour moi cette mthode est spcifique au fonctionnement de ma JFrame Home.

PS: Toutes mes fentres son des singletons car sinon, chaque appelle  new Home() crerait une nouvelle fentre, ce que je ne veux pas.

----------


## une_tite_question

Voil o j'en suis,le message d'erreur provenait de la redfinition de actionPerformed.

Voici le code qui me donne l'erreur  l'execution


```

```

Et voici le code qui fonctionne 


```

```

quelle est la diffrence entre getSource() et getActionCommand() ?

Merci

----------


## MichaelBW

Tu comptes faire un if dans ton actionPerformed pour chaque JMenuItem?

L'intrt de dclarer 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 ragir alors, parce que seul le composant a qui appartient le listener pourra accder  cet actionPerformed.

Par contre il est interressant d'externaliser les composants eux-mme.

Au dbut 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 mthode qui fait plein de chose que plein de mthodes qui font plus ou moins la mme chose mais au final  devient surtout ingrable, inmaintenable et illisible.

Enfin, c'est juste un conseil. Pour apprendre ton code est interressant car il clairci les mcanismes.  :8-):

----------


## doGet

getSource() te renvoie l'objet qui  cre l'vnement ( savoir le JMenuItem ouvrir dans ton cas).
getActionCommand() te renvoie le texte associ  l'action (qui ici est initialis par dfaut  la valeur String de l'objet appelant : ouvrir).

Le problme 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 spare de celle de ta fentre ou est dfini l'objet ouvrir.
Une solution  a est dans l'exemple de code de Michael, accder  l'instance de ta fentre de faon statique :


```

```

ce qui te donne :



```

```

et pour ton listener :



```

```

----------


## MichaelBW

DoGet, tu cris 


```

```

instance vaudra toujours null donc tu retournera toujours une nouvelle instance de Fenetre()  ::bug:: 

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

----------


## doGet

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.  :;):

----------


## MichaelBW

Ben le truc c'est que si il clic plusieurs fois, il reinitialisera toute la fentre  chaque fois et perdra donc tout tat  :;): 

Enfin maintenant,  dpend de ce qu'il veut faire mais faire des new "cote", donc il vaut mieux optimiser.

----------


## une_tite_question

Bonjour,




> L'intrt de dclarer 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 ragir alors, parce que seul le composant a qui appartient le listener pourra accder  cet actionPerformed.


En effet je ne voyais pas les choses de cette faon.
Quelle est la faon la plus simple et la plus claire de coder(et peut tre la plus professinnelle) classe interne ou externe.




> Le problme 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 spare de celle de ta fentre ou est dfini l'objet ouvrir.


Tu as parfaitement compris mon problme .Je vais tester l'utilisation d'une mthode getInstance().
Quelle est la diffrence entre une mthode getInstance() qui retourne une instance et la mthode fenetre instance = new fenetre() qui pour moi cre une instance il y a surement des subtilits que je n'ai pas compris.

Merci

----------


## MichaelBW

La mthode getInstance que je propose renvoi une instance, oui, mais pas une nouvelle a chaque fois, mais la mme!! 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() cre une nouvelle instance a chaque fois!

----------


## une_tite_question

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-mme


Finalement j'ai russi  utiliser ma classe externe sans passer par une mthode getInstance, en faisant deux modifs dans mes codes prcdents.
Peux tu me dire quelle est la mthode la plus propre.Aprs je pourrais fermer le post


```

```

MLa classe qui gre les events



```

```

Merci

----------

