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

Composants Java Discussion :

Fermeture d'une fenêtre ou un JTextField


Sujet :

Composants Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Azerbaïdjan

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Fermeture d'une fenêtre ou un JTextField
    Bonjour,

    J'ai un problème avec mon code, je pense que ça vient soit de ma fenêtre qui est mal fermée soit du JTextField que je n'utilise pas comme il faut.

    Alors je m'explique : J'ai crée un jeu du pendu en Java avec une interface graphique etc. Quand on démarre le jeu, on arrive sur une fenêtre principale, puis, on clique sur Play pour jouer. Après avoir fini la partie (gagner, perdu ou bien simplement fermer la fenêtre), il reste encore la fenêtre principale (logique), si on re-clique à nouveau sur Play, tout fonctionne bien sauf que dès qu'on entre une lettre, cette erreur apparait :
    Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:658)
    at Game.play(Game.java:40)
    at Game.update(Game.java:71)
    at java.util.Observable.notifyObservers(Observable.java:159)
    at MouseDispatcher.fireUpdate(MouseDispatcher.java:28)
    at Draw.actionPerformed(Draw.java:211)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3312)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:702)
    at java.awt.EventQueue$4.run(EventQueue.java:700)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    La ligne 40 de la classe Game contient ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    already=h.alReadyTried(input.charAt(0));
    input étant un String correspondant à la saisie clavier de l'utilisateur (j'utilise charAt(0) pour récupérer la 1ere lettre saisie au cas où il en mette plusieurs.. )

    Donc soit mon problème vient de mon JTextField, soit étant donné que la 1ere fois tout se passe bien, c'est ma fenêtre qui est mal fermée. Pour fermer cette dernière j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pan.removeAll();
    pan.setEnabled(false);
    this.removeAll();
    this.dispose();
    this étant ma fenêtre et pan une classe qui hérite de JPanel. Je ne vois pas quoi faire de plus ?

    Comme mon projet contient pas mal de classes, je l'ai zippé et mis en pièce jointe.

    Quelqu'un saurait-il m'indiquer d'où peut venir le problème ?

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Le problème vient du fait que ton JTextField peut être vide. Ton exception dit que tu essayes de récupérer un caractère à une position qui dépasse la chaine. Par exemple, si tu veux recupérer le caractère 10 de la chaine "Salut", tu as cette exception.

    Essaye plutôt un code comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(input == null || input.isEmpty()) {
      already = false;
    } else {
      already=h.alReadyTried(input.charAt(0));
    }
    En parant du principe que si l'utilisateur n'a rien rentré, c'est faux.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Azerbaïdjan

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ça veut dire qu'à chaque 2eme 3eme 4eme etc. partie l'utilisateur aura une erreur en plus dés le début pour rien ?

    De plus l'erreur apparait quand on entre effectivement un caractère donc atChar(0) ne devrait pas renvoyer d'erreur...

    J'édite pour dire que j'ai eu la réponse, le problème venait en fait de mon MouseDispatcher qui était présent plusieurs fois (alors que c'est un singleton oO pour l'instant je ne comprend pas ça ).

  4. #4
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Je ne vois pas en quoi ton MouseDispatcher est utilisé plusieurs fois. Tout d'abord parce que c'est un singleton, et ensuite parce que tu ne l'utilises nul part ailleurs que dans Game pour être notifié et dans Draw pour notifier.

    Ton problème est-il néanmoins résolu ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Azerbaïdjan

    Informations forums :
    Inscription : Juillet 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui il est résolu, le mouseDispatcher est bien un singleton mais à chaque nouveau jeu je lui ajouté un Observer donc au 2eme coup il avait 2 obervers puis après 3 etc.

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

Discussions similaires

  1. Evènement sur le body lors de la fermeture d'une fenêtre
    Par Yaz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 17h54
  2. Exécuter une action à la fermeture d'une fenêtre
    Par wwave dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 28/07/2005, 15h15
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 13h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

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