Remplir une JTable avec une requête SQL [Résolu]

Messages postés
23
Date d'inscription
mercredi 9 août 2006
Dernière intervention
12 août 2013
- - Dernière réponse : cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
- 8 févr. 2012 à 16:13
Bonjour à tous et à toutes !

Me re voila avec un nouveau souci (en ce moment ça n'arrête pas...).

En effet, je cherche à remplir une JTable avec le résultat d'une requête exécuté sur une base de donnée HSQL.
J'ai trouvé beaucoup de topics à ce sujet sur internet mais aucun ne répond à mon besoin.

Afin de bien comprendre le problème je vais prendre le temps de détailler mon architecture :

Je dispose d'une classe Tableau extends JPanel (avec un attribut privé JTable) qui fait appel, dans son constructeur, à une classe ModelTableau extends AbstractTableModel (class définie dans le même .java).
Pourquoi ce choix ? Car j'ai absolument besoin de redéfinir ma méthode setValueAt (object[], int, int) pour certaines interactions dans le tableau.
Cette classe est appelée dans mon interface graphique par
JComponent ContentPaneTableau = new Tableau();

Les résultats qui doivent être attribués à chaque Cellule[i][j] de mon tableau sont issus d'une requête et non pas d'une table (problème pour lequel j'ai trouvé ce code source au passage...si jamais quelqu'un passe par la avec un problème similaire à l'avenir).

Une chose curieuse : quand je demande un System.Out.Print(result) (résult étant le ResultSet de ma requête effectuée via un statement.execureQuery(requete)) pour vérifier le contenu du résultat de ma requête voila ce que m'affiche eclipse :
org.hsqldb.jdbc.JDBCResultSet@1db7df8

Voila pour la conception de la chose...
Je souhaiterais donc valoriser mon tableau avec les résultats de ma requête SQL...J'ai essayé pas mal de choses en fonction de ce que j'ai pu lire sur le net mais je ne suis qu'un humble codeur et j'avoue être à court de liens potentiellement utiles

Merci d'avance !
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
2
Merci
Bonjour,

Le résultat de la requête est enregistré dans une resultset, c'est un objet, si tu demandes un affichage, la méthode toString est appelée. Cette méthode n'a pas été surchargée, elle est donc identique à celle de Object et la référence mémoire est affichée.

Pour accéder aux données, il faut parcourir la résultset de cette manière :

while(resultset.next()){
   System.out.println(resultset.getString("nomColonne");
}

Merci cs_Julien39 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
1
Merci
data = {resultString}; ne donne rien...


Ben, il ne faut pas rêver non plus

Tu as un ArrayIndexOutOfBoundsException parce que tu n'as pas initialisé ton tableau :
//Tu peux obtenir le nombre de lignes du tableau en faisant un select count(*)...
int nombreLignes=30;
String[][] matrice=new String[nombreLignes][];
for (int i=0 ; i<matrice.length; i++){
    matrice[i]=new String[resultset.getMetaData().colomnCount()];
    matrice[i][0]=resultset.getString(0);
    //Idem pour les autres, tu peux faire une boucle
}
Commenter la réponse de cs_Julien39
Messages postés
23
Date d'inscription
mercredi 9 août 2006
Dernière intervention
12 août 2013
0
Merci
Merci, l'affectation se fait bien donc la requête est fonctionnelle.

Mes données sont stockées dans un attribut privé :
private Object[][] data;

La valorisation de cet attribut est possible à l'initialisation :
private Object[][] data = {
        {new Boolean(false), "StairWay to Heaven", "Led Zeppelin", "Rock", new Boolean(false), new Boolean(false)},
        {new Boolean(false), "Whole lotta love", "Led Zeppelin", "Rock", new Boolean(false), new Boolean(false)}
        };

Mais comment puis-je valoriser cet objet avec les valeurs de ma requête ?
J'ai essayé data[0][1]= "test"; mais eclipse me renvoi l'erreur
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
Ce n'est donc pas un tableau à double entrée particulier ?

Je ne vois pas d'accesseurs dans la class object...
Commenter la réponse de cs_BXH
Messages postés
23
Date d'inscription
mercredi 9 août 2006
Dernière intervention
12 août 2013
0
Merci
J'ai concaténé ma chaine d'affectation dans une String :
{new Boolean(false), "StairWay to Heaven", "Led Zeppelin", "Rock", new Boolean(false), new Boolean(false)},
{new Boolean(false), "Whole lotta love", "Led Zeppelin", "Rock", new Boolean(false), new Boolean(false)}

Comment puis-je l'affecter à mon Object ?
data = {resultString}; ne donne rien...

Merci d'avance.
Commenter la réponse de cs_BXH
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Si j'étais à ta place, je ne mettrais rien dans le tableau, la resultset est tout de même plus adaptée au stockage des sorties d'une requete SQL
Commenter la réponse de cs_Julien39
Messages postés
6450
Date d'inscription
mardi 8 mars 2005
Dernière intervention
17 mai 2018
0
Merci
Faute de réponse, j'ai accepté les réponses à ta place. Pense à le faire la prochaine fois.

a+
Commenter la réponse de cs_Julien39

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.