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

JavaFX Discussion :

afficher dans un tableView depuis une bdd tous les fils et petits fils d'un noeud


Sujet :

JavaFX

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut afficher dans un tableView depuis une bdd tous les fils et petits fils d'un noeud
    j'ai une table dans ma bdd où chaque élément a un père, j'ai besoin d'afficher dans un tableau tous les subnodes d'un noeud donné, j'ai prévu une méthode qui extrait d'un noeud donné tous ses fils et de l'appeler dans une méthode récursive en remplissant le tableView

    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
     
    private void fillTable(String codeComp) throws SQLException {
        //extraction des fils du noeud courant "codeComp" dans une ObservableList "compFils"   
        sqlObj.fillFils(codeComp, compFils);
     
     
            for (String entry : compFils) {
                //boucle jusqu'au dernier élément qui n'a pas de fils et affiche
                if (compFils == null) {
                    /*code affichage dans tableView*/
                    System.out.println(entry);
                } else {
                    //appel récursive avec le noeud fils pour avoir ses fils
                    fillTable(entry);
                }  
          }         
    }
    mais ce code ne génère rien et se bloque sans donner une exception

    merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je ne peux pas te dire comment corriger ton code, mais je peux te dire pourquoi cela ne fonctionne pas (ça ne bloque pas je pense, ça fait une stackoverflow exception)

    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
    private void fillTable(String codeComp) throws SQLException { // 1 seul paramètre, codeComp. Donc compFils, qui doit être un attribut de la classe est toujours le même
     
        //extraction des fils du noeud courant "codeComp" dans une ObservableList "compFils"   
        sqlObj.fillFils(codeComp, compFils); // on fait je ne sais quoi
     
     
            for (String entry : compFils) { // on itère sur des chaînes contenues dans compFils
                //boucle jusqu'au dernier élément qui n'a pas de fils et affiche
                if (compFils == null) { // si compFils est null (ce qui est impossible : si c'était le cas, tu aurais une NullPointerException dans le for !!!
                    /*code affichage dans tableView*/
                    System.out.println(entry); // on affiche un truc qui ne peut pas exister
                } else {
                    //appel récursive avec le noeud fils pour avoir ses fils
                    fillTable(entry); // on rappelle la méthode elle-même avec un élément de la chaîne
                }  
          }         
    }
    En résumé, ton code parcourt une liste de chaînes de caractères, et pour chacune de ces chaînes reparcourt la même liste, toujours, indéfiniment (récursivement), (à chaque chaîne on refait le fillFils).
    La récursivité infinie est dû au fait qu'il n'y a aucune condition d'arrêt :
    • la liste ne varie à priori pas (à moins que fillFils le fasse, mais ce serait assez bizarre comme conception)
    • on n'utilise nulle part le paramètre de la méthode (mis à part dans un appel qui n'est pas lié à l'appel récursif), donc celui-ci ne peut intervenir dans une condition d'arrêt
    • Le if dans l'itération ne sert à rien du tout : il teste un cas impossible...et ne peut donc servir de condition d'arrêt
    • il n'y a rien d'autre qui intervient dans la boucle. Donc mis à part si la liste est vide, on a une récursivité infinie.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Il faut enlever la condition à l'intérieur de la boucle, j'ai compris que c'est ta condition d’arrêt c'est de s'assurer qu'il n y a pas de nœud fille.
    Mais où est ce que tu initialise la variable comFils, car si tu utilise la variable en le changeant dans la méthode sqlObj.fillFils(codeComp, compFils), ça ne va jamais marcher car ton teste c'est sur la référence or avec sqlObj.fillFils(codeComp, compFils) on ne peut jamais modifier la référence de compFils, même si tu le change au sein de la méthode c'est en vain, alors ton code doit être quelque chose comme ça:
    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
    private void fillTable(String codeComp) throws SQLException {    //extraction des fils du noeud courant "codeComp" dans une ObservableList "compFils"   
        ObservableList<String>  compFils = sqlObj.fillFils(codeComp);// comme ça ta méthode va retourner la liste des filles sinon null
        if (compFils == null) {
                    /*code affichage dans tableView*/
                    System.out.println(entry);
                } else {
     
                      for (String entry : compFils) {
                   //boucle jusqu'au dernier élément qui n'a pas de fils et affiche
     
                    //appel récursive avec le noeud fils pour avoir ses fils
                    fillTable(entry);
                }  
          }          
    }

  4. #4
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    mais le entry est défnit dans la boucle je ne pourrais l'afficher dans le premier test avant la boucle, je suis entrain d'y penser

  5. #5
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Je m'excuse d'avoir oublié que que j'affiche entry. Dans tous les cas la logique de quelque chose d'arborescente ne peut pas mettre la partie d'affichage dans une boucle, car lui même qu'on boucle s'il n'a pas de fille il sera affiché lui seul, et c'est ça l’arrêt d'une fonction récursive.
    Ainsi normalement ton code je devrais écrire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void fillTable(String codeComp) throws SQLException {    //extraction des fils du noeud courant "codeComp" dans une ObservableList "compFils"      
     ObservableList<String>  compFils = sqlObj.fillFils(codeComp);// comme ça ta méthode va retourner la liste des filles sinon null
        if (compFils == null) {
                    /*code affichage dans tableView*/
                    System.out.println(codeComp);
                } else {
     
                      for (String entry : compFils) {
                   //boucle jusqu'au dernier élément qui n'a pas de fils et affiche
     
                    //appel récursive avec le noeud fils pour avoir ses fils
                    fillTable(entry);
                }
    Et si le texte du codeComp n'est pas directement celui qui devrait être affiché lui même, alors là tu as une 2e donnée qui dépend de codeComp, alors tu pourra avoir une autre méthode de récupération de ce texte et ton code sera que chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void fillTable(String codeComp) throws SQLException {    //extraction des fils du noeud courant "codeComp" dans une ObservableList "compFils"       
    ObservableList<String>  compFils = sqlObj.fillFils(codeComp);// comme ça ta méthode va retourner la liste des filles sinon null
        if (compFils == null) {
                    /*code affichage dans tableView*/
                    String entry =getEntry(codeComp)
                    System.out.println(entry);
                } else {
     
                      for (String entry : compFils) {
                   //boucle jusqu'au dernier élément qui n'a pas de fils et affiche
     
                    //appel récursive avec le noeud fils pour avoir ses fils
                    fillTable(entry);
                }

  6. #6
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    j'ai essayé de simplifier la méthode , je veux juste remplir ma liste avec les codes des fils jusqu'au dernier petit fils, j'ai ajouté une méthode qui teste si un élément a des fils ou pas

    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
     
    private void fillTable(String codeComp) throws SQLException {
            sqlObj.fillFils(codeComp, sys, codeFils);//rempli dans codeFils tous les fils de codeComp
     
            //si ce codeComp n'est pas un père donc il n'a pas de fils on sort en imprimant toute la liste
            if(!sqlObj.estPere(codeComp)){
                for(String c : codeFils){
                    System.out.println(c);
                }
            }else{
                //appel récursive
                for(String entry : codeFils){
                    fillTable(entry);
                }
            }
    }
    ce code plante et fait planter le serveur mySQL , je reçois sans cesse cet exception
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.Errorjava.lang.NullPointerException
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    j'ai aussi essayé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void fillTable(String codeComp) throws SQLException {        
            sqlObj.fillFils(codeComp, sys, codeFils);//je récupère les fils de codeComp dans codeFils
            for(String c : codeFils){//je parcours cette liste
                if(sqlObj.estPere(c)){//si le code parcouru est un père donc récupérer ses fils par appel récursif qui les ajoute toujours à codeFils
                    fillTable(c);
                }
            }
    }
    je n'arrive pas a résoudre ce problème

  7. #7
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    c'est bon j'ai refais la récursivité sur les items du TreeView et ça a bien fonctionné, merci à vous tous

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/01/2015, 11h50
  2. Réponses: 2
    Dernier message: 08/08/2014, 13h51
  3. Comment placer un lien dans un tableau depuis une bdd?
    Par redhotchilipeppers dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/01/2011, 22h00
  4. Insertion de données dans un grid depuis une bdd
    Par Vil'Coyote dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 20/08/2009, 11h21
  5. [RegEx] chercher depuis une occurence, tous les mots concordant.
    Par cactus_piquant dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2009, 15h59

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