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

 Java Discussion :

Ajout de ligne dans une JTable


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut Ajout de ligne dans une JTable
    Bonjour,

    Je cherche depuis plusieurs heures comment afficher les lignes que je récupère depuis ma requête SQL (via mon ResultSet) sur ma JTable.

    J'ai créer une méthode qui exécute une requête SQL et retourne une List<List<Object>>(2 cases). La première case (0) contient une liste avec le nom des colonnes et la seconde case (1) contient la seconde liste qui contient des Object[] correspondant aux champs de la base (les lignes).
    Voilà comment elle se remplissent :
    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
    List<List<Object>> result = new ArrayList<List<Object>>(2);
    List<Object> dataLines = new ArrayList<Object>();
    List<Object> nomColonne = new ArrayList<Object>();
    ResultSet rs = c.createStatement().executeQuery(sql_command);
    int numColumns = rs.getMetaData().getColumnCount();
    for ( int i = 0 ; i < numColumns ; i++ )
    	nomColonne.add(rs.getMetaData().getColumnLabel(i+1));
    result.add(nomColonne);
    // Read SQL rows
    while(rs.next())
    {
    	Object[] obj = new Object[numColumns];
    	for ( int i = 0 ; i < numColumns ; i++ ) {
    		// Column numbers start at 1.
    		obj[i] = rs.getObject(i+1);
    	}
    	dataLines.add(obj);
    }
    result.add(dataLines);

    Ensuite dans la fonction qui récupère cette liste de liste, j'essaye de le mettre dans ma JTable.
    Pour les colonnes c'est bon car je fais un :
    liste.get(0).toArray() -> Object[]
    et
    model.setColumnIdentifiers(liste.get(0).toArray());

    En revanche pour ajouter les lignes, j'utilise model.addRow(Object[]);
    Donc j'ai essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i = 0; i < liste.get(1).size(); i++)
    {
           Object[] o = liste.get(1).get(i). // Je n'ai pas accès à toArray() ici
           model.addRow(o);
    }

    Comment faire pour ajouter les lignes à la JTable ?
    Est-ce que une List<List<Object>> est une bonne solution ?
    (Bien entendu, il ne faut pas les mettre dans la méthode qui exécute la requête...)

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    si ta List<List<Object>> n'a pas d'autre but que d'être mis dans une table, peut-être serait-il plus judicieux de créer un TableModel à la place. Comme ça, tu pourra le fournir directement à ta JTable et tu n'auras plus de soucis de conversion.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    En gros je veux faire une méthode qui retourne la liste des colonnes et la liste des lignes d'une requête SQL passé en paramètre.

    Puis remplir ma JTable ensuite. Rien de bien compliquer mais je n'y arrive pas !

    Ensuite je pense qu'on peux s'en sortir avec le DefaultTableModel.
    Sauf que je n'arrive pas à récupérer mes champs lorsque la liste contient des tableaux d'objets. Car il ne voit pas le type Object[] à la lecture !

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Citation Envoyé par Aure7780 Voir le message
    Sauf que je n'arrive pas à récupérer mes champs lorsque la liste contient des tableaux d'objets. Car il ne voit pas le type Object[] à la lecture !
    Qu'entends-tu par "il ne voit pas le type Object[]"?

    Egalement, peux-tu être un peu plus précis sur ce qui te pose problème:
    - Lire le ResultSet,
    - Remplir le TableModel,
    - autre chose?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    Eh bien :
    modelTab.setColumnIdentifiers(...
    Cette méthode du model attends un Object[] en paramètre.
    Donc pour faire ça je fais l.get(0).toArray(); -> je récupère le premier élément de ma liste qui contient une liste de nom de colonnes (List) puis je fais toArray() pour qu'il retourne un Object[]


    En revanche modelTab.addRow(...
    Cette méthode du model attend aussi un Object[] en paramètre.
    Or le second élément de ma liste contient une liste (List) qui contient des Object[] représentant les champs récupérés de la bdd.
    Donc dans une boucle je fais :
    for(int i=0; i < l.get(1).size(); i++)
    l.get(1).get(i);

    Le problème c'est que j'ai pas la méthode toArray() pour avoir un type Object[] et par défaut l.get(1).get(i) retourne un Object.

    Le problème c'est remplir le TableModel.


    EDIT :
    J'ai trouvé : j'ai casté l.get(1).get(i); en Object[]
    Ma boucle deviens donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0; i < l.get(1).size() ; i++)
       modelTab.addRow((Object[])l.get(1).get(i));
    Après je sais pas si c'est propre ?

  6. #6
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Citation Envoyé par Aure7780 Voir le message
    Après je sais pas si c'est propre ?
    Il y a un point que je trouve "pas très propre" : Dans ta liste, tes éléments ne représentent pas des objets similaires. La valeur à l'index 0 n'est pas du tout utilisé de la même manière que la valeur à l'index 1.
    Conceptuellement, ça me gène.

    Comme ces valeurs ont des rôles différents, il serait plus propre de te créer un objet Resultat (par exemple) qui contiendra deux champs : les en-têtes (List<String> -> ta première valeur) et les données (List<Object[]> -> ta seconde valeur).

    Dèjà, tu vois que le cast que tu as été obligé de faire disparaitrait, c'est plutôt bon signe.

    Après, en regardant cette classe Resultat de plus près, on peut se rendre compte qu'elle est assez proche d'un TableModel. Donc pourquoi ré-inventer la roue? Il n'y a qu'à utiliser une des implémentations du TableModel directement.

    Donc ce que je te suggère, c'est de remplir directement un TableModel, sans créer de List<List<Object>>.

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

Discussions similaires

  1. Ajout d'une ligne dans une JTable
    Par d_hazem dans le forum Composants
    Réponses: 3
    Dernier message: 22/09/2008, 10h56
  2. [AJAX] Ajout de lignes dans une table avec Ajax
    Par Tententai dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/11/2007, 15h54
  3. ajout/suppression d'une ligne dans une jTable
    Par amelA dans le forum Composants
    Réponses: 1
    Dernier message: 16/05/2007, 08h42
  4. [web] Wxperl -> ajout de ligne dans une grid
    Par Airmoi dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 08/11/2006, 15h55
  5. Réponses: 14
    Dernier message: 22/09/2005, 16h49

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