Remplir une JTable avec une requête SQL

Résolu
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 - 27 janv. 2012 à 20:38
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 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 !

6 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
27 janv. 2012 à 22:21
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");
}
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
28 janv. 2012 à 13:37
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
}
2
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
27 janv. 2012 à 22:50
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...
1
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
28 janv. 2012 à 00:11
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.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
28 janv. 2012 à 13:41
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
1
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
8 févr. 2012 à 16:13
Faute de réponse, j'ai accepté les réponses à ta place. Pense à le faire la prochaine fois.

a+
1
Rejoignez-nous