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

JDBC Java Discussion :

JTree remplissage depuis une requête SQL


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut JTree remplissage depuis une requête SQL
    Bonjour à tous,

    je me permet de solliciter votre aide car je rencontre un problème pour finaliser un code me permettant de construire un JTree depuis une base de donnée.
    J'ai créer la fonction ci-dessous pour alimenter un JTree depuis un tableau a entrée multiple, tout fonctionne parfaitement bien.
    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
    public void bddTree () throws SQLException{
     
            //il faut allimenter le objectTable avec la requet SQL
            Object[][] table = {
            {1, 1, "CHENIEUX"}, //i=0
            {2, 1, "Administration"}, //i=1
            {3, 2, "po-c-pradeau"}, //i=2
            {4, 2, "po-j-mondout"}, //i=3
            {5, 2, "pc-m-savignat"}, //i=4
            {6, 1, "PC Scan-IRM"}, //i=5
            {7, 6, "Noeud7"}, //i=6
            {8, 6, "Noeud8"}, //i=7
            {9, 6, "Node9"}, //i=8
            {10, 1, "Node10"},};    //i=9          
            //Création de tous les noeuds de la table.
        DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[table.length];
        for (int i = 0; i < table.length; i++) {
            node[i] = new DefaultMutableTreeNode(table[i][2].toString());
        }
        //fin boucle 
        DefaultMutableTreeNode  rootNode = node[0];   //On définie le Nœud Root.
        //on lit le tableau et on assigne les noeuds.
        for (int i = 0; i < table.length; i++) {
            for (int j = 1; j < table.length; j++) {
                if (table[i][0] == table[j][1]) {
                    System.out.println(table[i][2].toString() + " est le parent de : " + table[j][2].toString());
                    node[i].add(node[j]);
                }
            }
        }
        //on crée le model pour le JTree avec.
        DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
        //Application du model au JTree.
        jTree_bdd.setModel(treeModel);
        }
    J'aimerai maintenant alimenter ce tableau avec une table de ma base donnée qui reprend le même shema que mon tableau écrit en dur dans l'appli.
    J'ai essayé plusieurs méthodes trouvé sur le net, sans sucés, mes connaissances en SQL--> java étant limité je galère vraiment.
    Si quelqu'un peu me mettre sur la bonne piste pour alimenter correctement le tableau depuis ma requête SQL.
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Citation Envoyé par Phixx Voir le message
    J'ai essayé plusieurs méthodes trouvé sur le net, sans sucés,
    Tu peux nous les montrer pour qu'on puisse les corriger?

    A+.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Désolé mon copier coller as du bug je vous le colle :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     public void bddTree () throws SQLException{
     
            //il faut allimenter le objectTable avec la requet SQL
           /* Object[][] tablePOK = {
            {1, 1, "CHENIEUX"}, //i=0
            {2, 1, "Administration"}, //i=1
            {3, 2, "po-c-pradeau"}, //i=2
            {4, 2, "po-j-mondout"}, //i=3
            {5, 2, "pc-m-savignat"}, //i=4
            {6, 1, "PC Scan-IRM"}, //i=5
            {7, 6, "Node7"}, //i=6
            {8, 6, "Node8"}, //i=7
            {9, 6, "Node9"}, //i=8
            {10, 1, "Node10"},};    //i=9
           // Object[][] table;*/
             try{
                Statement st = gestionBdd.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY);
                ResultSet res = st.executeQuery("Select * from tabchenvnc");
                ResultSetMetaData meta = res.getMetaData();
                Object[] column = new Object[meta.getColumnCount()];
     
    			for (int i = 1; i <= meta.getColumnCount(); i++) {
    				column[i - 1] = meta.getColumnName(i);
    			}
    			res.last();
    			int rowCount = res.getRow();
    			Object[][] data = new Object[res.getRow()][meta.getColumnCount()];
     
    			// On revient au départ
    			res.beforeFirst();
    			int j = 1;
     
    			// On remplit le tableau d'Object[][]
    			while (res.next()) {
    				for (int i = 1; i <= meta.getColumnCount(); i++)
    					data[j - 1][i - 1] = res.getObject(i);
     
    				j++;
    			} 
                            //Création de tous les noeuds de la table.
                DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[data.length];
                    for (int i = 0; i < data.length; i++) {
                       node[i] = new DefaultMutableTreeNode(data[i][2].toString());
                     }
                    //fin boucle 
                     DefaultMutableTreeNode  rootNode = node[0];   //On definie le Noeud Root.
                      //on lit le tableau et on assigne les noeuds.
                     for (int i = 0; i < data.length; i++) {
                           for (int k = 1; k < data.length; k++) {
                               if (data[i][0] == data[k][1]) {
                                 System.out.println(data[i][2].toString() + " est le parent de : " + data[k][2].toString());
                                  node[i].add(node[k]);
                                }
                             }
                        }
        //on crée le model pour le JTree avec.
        DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
        //Application du model au JTree.
        jTree_bdd.setModel(treeModel);
     
     
     
            }catch(SQLException e){
                e.printStackTrace(); 
            }
        }
    voila le screen de la table :

    voila le resultat de mes compétences en SQL :

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Est ce que quelqu'un as une petite idée, dans quelle boucle je me plante.

    Merci de votre aide.

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Essaie de faire

    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
    ResultSet res = st.executeQuery("Select * from tabchenvnc");
    int nbColumn = res.getMetaData().getColumnCount();
     
    res.last();
    int rowCount = res.getRow();
    Object[][] data = new Object[rowCount][nbColumn];
     
    // On revient au départ
    res.beforeFirst();
    int j = 0;
     
    // On remplit le tableau d'Object[][]
    while (res.next()) {
    	for (int i = 0; i < nbColumn; i++)
    		data[j][i] = res.getObject(i+1);
    	j++;
    } 
    for (int i=0; i < rowCount ; i++){
    	System.out.print("{");
    	for (int k = 0; k < nbColumn; k++)	
    		System.out.print(data[i][k] + ", ");
    	System.out.println("}");
    }
    pour voir ce qu'il retourne.

    A+.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Merci d'avoir pris du temps pour moi,

    voila le résultat de ton code :

    run:
    {1, 1, CHENIEUX , }
    {2, 1, po-c-pradeau , }
    {3, 1, po-j-mondout , }
    {4, 1, pc-m-savignat , }

    et j'ai toujours que le rootNodes qui s'affiche alors que lorsque je le fait avec le tableau en dur tout marche nikel.

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Remplace cette ligne
    if (data[i][0] == data[k][1])
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (data[i][0].equals(data[k][1]))
    A+.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Je viens de faire la modification effectivement je n'avais pas fait attention que je tester les String comme des entiers. mais sa ne solutionne pas mon problème j'utilise peut être un mauvais raisonnement je suis un peu perdu, mon soucis c'est que aujourd'hui je ne peu plus laisser le tableau écris en dur dans application il y a trop de modification journalière, ce qui m'oblige a recompiler le programme tous les jours. est ce que ce serai plus simple avec un fichier de paramètre peut être ?

  9. #9
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Je pense qu'il ne passe pas dans la condition if.

    De quels types sont ces deux champs da la base?
    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (data[i][0].toString().equals(data[k][1].toString()))
    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i = 0; i < data.length; i++) {
                           for (int k = 1; k < data.length; k++) {
                             Systeme.out.println(data[i][0].getClass() + "   "  + data[k][1].getClass())
                             }
                        }
    A+.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Donc voila le résultat avec tes précisions, je ne t'en ai pas parler mais ds ma table j'ai les champs suivant :

    idtree = integer clé primaire (num auto avec séquence incrément de 1)
    numtree = integer numéros du nœud de l'arbre
    nomtree = character le nom du nœud

    c'est le meme shéma que mon tableau saisie a la main.

    depuis que nous avons fait les modifications de boucle comme tu m'as suggéré,

    j'ai le message d'erreur me disant que le noeud X et ancestor du noeud précédent.

    run:
    {1, 1, CHENIEUX , }
    {2, 2, po-c-pradeau , }
    {3, 2, po-j-mondout , }
    {4, 2, pc-m-savignat , }
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    class java.lang.Integer class java.lang.Integer
    Exception in thread "main" java.lang.IllegalArgumentException: new child is an ancestor
    at javax.swing.tree.DefaultMutableTreeNode.insert(DefaultMutableTreeNode.java:178)
    at javax.swing.tree.DefaultMutableTreeNode.add(DefaultMutableTreeNode.java:409)
    at jtreebdd.ihmJTreeBDD.bddTree(ihmJTreeBDD.java:92)
    at jtreebdd.ihmJTreeBDD.<init>(ihmJTreeBDD.java:34)
    at jtreebdd.JTreeBDD.main(JTreeBDD.java:14)

  11. #11
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Cette erreur vient de la création d'un noeud fils pour la ligne "{2, 2, po-c-pradeau , }", le code tente de lui mettre comme un noeud fils de lui même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (data[i][0].equals(data[k][1]) && i != k)
    A+.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    J'avais bien compris l'erreur, en tout cas merci de prendre du temps pour mon problème je développe des applications mathématique à la base pas ce genre d'application, étant complètement bloqué même avec tes commentaires j'ai décidé de tout reprendre depuis le début je suis repartie de ma méthode qui marché à la base.

    j'ai toujours le même problème . affichage du nœud root et plus rien je te remet ma fonction en entier. la condition if d'ajout de nœud et remis en == car ce sont bien des entiers.

    si en relisant tu vois quelque chose. Je rappel le principe stocker arborescence d'un JTree dans une base de donnée pour pouvoir en gérer simplement le contenu. cette arbre représente des PC pouvant être pris en main via VNC.

    j'ai peut être la mauvaise méthode ou existe t'il peut être une autre solution que celle que j'avais déployé il y a presque 5 ans. A la base c'été simple je n'avais que une 10 aine de machines aujourd'hui j'en ai 190 a gérer et c plus possible pour moi de tenir cela dans un tableau a double entré en dur dans l'appli.

    En tout cas merci bcp de ton aide et de ton temps.

    Cordialement.

    voici la méthode :
    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
     public void bddTree () throws SQLException{
     
             try{
                Statement st = gestionBdd.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY);
                ResultSet res = st.executeQuery("Select * from tabchenvnc");
                int nbColumn = res.getMetaData().getColumnCount();
     
                res.last();
                int rowCount = res.getRow();
                Object[][] data = new Object[rowCount][nbColumn]; 
                // On revient au départ
                res.beforeFirst();
                int j = 0; 
                // On remplit le tableau d'Object[][]
                while (res.next()) {
                    for (int i = 0; i < nbColumn; i++)
    		data[j][i] = res.getObject(i+1);
                    j++;                
                }
                for (int i=0; i < rowCount ; i++){
                    System.out.print("{");
                        for (int k = 0; k < nbColumn; k++)	
                            System.out.print(data[i][k] + ", ");
                            System.out.println("}");
                        }
     
                //Creation de tous les noeuds comme le row of data
        DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[data.length];
        for (int i = 0; i < data.length; i++) {
            node[i] = new DefaultMutableTreeNode(data[i][2].toString());
        }
        rootNode = node[0];   //Definition du noeud root de l'arbre JTree_bdd
        //Parcours du tableau et assignement des noeuds
        for (int i = 0; i < data.length; i++) {
            for (int k = 1; k < data.length; k++) {
                if (data[i][0] == data[k][1]) {
                    System.out.println(data[i][2].toString() + " is parent of " + data[k][2].toString());
                    node[i].add(node[k]);
                }
            }
        }
        //on creer le table model avec le noeud root defini ci-dessus.
        treeModel = new DefaultTreeModel(rootNode);
        //On applique le JModel.
        jTree_bdd.setModel(treeModel);
     
            }catch(SQLException e){
                e.printStackTrace(); 
         }
        }
    Je met aussi la méthode que j'ai écrite y a 5 ans si sa peut aider :
    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
        public void treePcVnc(){
            //tableau des machines -> reprensente l'arbre. 
            Object[][] table = {
            {1, null, "Chenieux"}, //i=0
            {2, 1, "PC-CHENIEUX"}, //i=1
            {3, 2, "po-j-mondout"}, //i=2
            {4, 2, "po-c-pradeau"}, //i=3
            {5, 2, "pc-m-savignat"}, //i=4
            {6, 2, "pc-acc-1"}, //i=5
            {7, 2, "pc-acc-2"}, //i=6
            {8, 2, "pc-irm"}, //i=7
            {9, 2, "pc-scan"}, //i=8
            {10, 2, "pc-pointage"},};    //i=9
     
        //Creation de tous les noeuds comme le row of data
        DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[table.length];
        for (int i = 0; i < table.length; i++) {
            node[i] = new DefaultMutableTreeNode(table[i][2].toString());
        }
     
        rootNode = node[0];   //Definition du noeud root de l'arbre JTree_bdd
     
        //Parcours du tableau et assignement des noeuds
        for (int i = 0; i < table.length; i++) {
            for (int j = 1; j < table.length; j++) {
                if (table[i][0] == table[j][1]) {
                    System.out.println(table[i][2].toString() + " est le parent de " + table[j][2].toString());
                    node[i].add(node[j]);
                }
            }
        }
        //Creation du model pour l'arbre JTree et set du rootNodes
        treeModel = new DefaultTreeModel(rootNode);
        //Application du model au Jtree
        JTree tree = new JTree(treeModel);
        //Ajout du JTree au JPanel.
        add(tree);
    }

  13. #13
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Comme j'ai dit dans mon dernier message, remplace cette condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (data[i][0] == data[k][1])
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (data[i][0].equals(data[k][1]) && i != k)
    .

    A+.

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

Discussions similaires

  1. ComboBox chargée depuis une requête SQL
    Par verrue dans le forum Flex
    Réponses: 10
    Dernier message: 08/10/2009, 19h42
  2. Remplissage de QComboBox depuis une requête SQL
    Par L0101SA dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/03/2008, 20h42
  3. Lancement d'un exe depuis une requête SQL
    Par mister_rom dans le forum Développement
    Réponses: 5
    Dernier message: 29/11/2007, 10h27
  4. Lancement d'un exe depuis une requête SQL
    Par mister_rom dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 29/11/2007, 10h27
  5. Générer une requête SQL depuis un model physique
    Par Ryan Sheckler dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/12/2005, 12h11

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