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 :

Recursivité et setIcone, problème de pile.


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut Recursivité et setIcone, problème de pile.
    Bonjour,
    Voila pour changer l'image de certains bouton, j'utilise une fonction recursive.
    Jusqu'à lors j'utilisais une simple chaine (avec un .setChaine(" ") ) pour tester le tout, cela ne posait pas de souci. Mais une fois passer a l'image c'est autre chose.
    J'utilise .setIcone, avec une iconeImage créer précédament, et j'obtiens l'erreur :
    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    .
    Le message se produit en boucle.
    J'ai testé également en changeant la couleur du bouton avec setBackground(), cela me sort la même erreur

    (edit, petit oubie dans le code désolé)
    public void liberationCaseVide(int k, int l)
    {
    (...)
    if (matriceCase[i+k][j+l] instanceof CaseVide)
    {
    matriceCase[i+k][j+l].bouton.setIcon(imageVide);
    liberationCaseVide(i+k,j+l);
    }
    (...)
    }

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Quand appelles-tu cette méthode?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Elle est appellé pour la 1er fois dans mon action listner.
    Quand je clique sur un bouton, l'action listener regarde de quelle type ce bouton.
    Si c'est du type CaseVide, il lance cette fonction. Dans cette fonction, je vais faire une double boucle pour regarder dans tout les cases adjacente à celle la, si ce sont aussi des CaseVide. Si c'est le cas, alors je change mon image et je rappelle ma fonction.

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    En effet, c'est une boucle infinie, et l'erreur que tu as (StackOverflowError) est normale :
    - tu exécutes cette méthode sur une case.
    - elle appelle la méthode sur son voisin disons de droite.
    - le voisin de droite exécute cette méthode.
    - il l'appelle sur tous ses voisins, c'est à dire sur la première.

    Comme tu n'as pas l'air de mentionner de condition d'arrêt, cette méthode effectue une récursion infinie.

    Un conseil (mais je peux être à côté de la plaque) : une case vide est une case dans un certain état. Elle peut en changer, or un objet ne peut pas changer de classe. CaseVide ne devrait donc pas être une classe, tu devrais plutôt te servir d'un attribut et d'une méthode (isVide() par exemple) pour déterminer si une case est vide.

    Ca te permettrait de coder plus facilement la récursion.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Tu m'arrêtes si je me trompe, mais imaginons la situation suivante :
    - Hypothèses :
    1) la case "(i,j)" est vide
    2) la case "(i+1,j) est vide

    - Déroulement :
    1) case (i,j) vide => appel liberationCaseVide() pour les cases adjacentes
    2) la méthode liberationCaseVide() est donc appelée pour la case (i+1,j)
    3) case (i+1,j) vide => appel liberationCaseVide() pour les cases adjacentes
    4) la méthode liberationCaseVide() est donc appelée pour la case (i,j)
    etc...

    Tu as donc bien une boucle infinie...
    Le problème vient de ton algo (si j'ai pas fait d'erreur)


    [EDIT] Grillé...

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    En effet c'était ca, merci beaucoup. En fait, j'avais mis une condition d'arret sans le vouloir, qui était de vérifier la valeur du text affiché sur le bouton pour eviter un null Excpetion.
    Ce qui fait le problème ne se posait pas quand je changeais mon bouton avec juste le texte, puisque j'avais cette 2eme condition d'arret.
    Enfin c'est bon, merci beaucoup ^^

Discussions similaires

  1. Problème de pile
    Par riana_ando dans le forum C
    Réponses: 2
    Dernier message: 24/10/2007, 10h04
  2. Problème débordement pile
    Par yoaugoulo dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 02h55
  3. [Problème] sauvergarde pile dans un fichier binaire
    Par ealexdesign dans le forum C++
    Réponses: 4
    Dernier message: 23/02/2007, 15h16
  4. [VBA-E]problème de pile pleine
    Par stos dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/01/2007, 11h37
  5. Problème de pile CMOS
    Par jphilve dans le forum Composants
    Réponses: 2
    Dernier message: 19/05/2006, 23h57

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