Problème affichage données SQL dans JTable

H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011 - 4 juil. 2011 à 13:14
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011 - 5 juil. 2011 à 16:06
Bonjour a toutes et a tous,

J'ai un nouveau soucis (encore un :/) avec une JTable qui se remplit par une requete SQL, le soucis est qu'il ne prends pas toutes mes colonnes en compte (alors qu'elles sont bien séléctionnées dans la requete ...)

Voila le code :

package gestionstocks;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
*
* @author ggeffray
* @version 1.0b
*
*/

//class pour afficher la liste des produits
public class tabProduit extends JFrame
{
JTable table;//instancition de JTable pour le remplissage des données a partir de la BDD
Statement statement;//creation du statement à partir de la chaine de connexion pour les requetes
ResultSet resultRequete;//conteneur du resultat de la requete excutée

public tabProduit()
{
table = remplirTable();//la table sera initialisée par la liste des produits envoyée par la fct 'remplirTable()'
table.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
// Un panneau, placé dans la fenêtre
JScrollPane panneau = new JScrollPane(table);//mettre la table dans ascenceur
getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
this.pack();
this.setLocation(100, 100);
this.setVisible(true);
}

/** Requête et résultats dans une JTable */
JTable remplirTable()
{
Vector tabLignes=new Vector(), nomCols=new Vector();
int i;
try
{
String requeteMysql = "Select RefProduit, LibProduit, PrixHTProduit, PrixTTCProduit, PoidsProduit, NomFourn, NomCateg "
+ "From Produit, Categorie, Fournisseur "
+ "Where Produit.Nocateg = Categorie.NoCateg "
+ "And Produit.NoFourn = Fournisseur.NoFourn";//chaine contenant la requete a executée
statement = (Statement) new BDD().conn.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql
resultRequete = (ResultSet) statement.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet
// Extraire noms des colonnes; les placer dans Vector nomCols
ResultSetMetaData md = resultRequete.getMetaData();
nomCols = new Vector();
for( i=1; i<=md.getColumnCount (); i++)
{
nomCols.add( md.getColumnLabel(i));
System.out.println(nomCols);
// Mémoriser le résultat dans la JTable
while( resultRequete.next())
{
//placer les valeurs dans Vector ligne
Vector ligne=new Vector();
for(i=1; i<=1; i++)
{
String ch=resultRequete.getString(i);
ligne.add(ch);
}
tabLignes.add(ligne);
}
}
}
catch(Exception e)
{
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}
return new JTable(tabLignes,nomCols);//type de retour qui initialise le JTable par la liste des vecteur envoyées remplis des tables
}
}

la classe est complète et est indépendante du reste.
Dans ma requete je souhaite afficher la refproduit, le libproduit, le prix (ht et ttc) le nofourn et le nocateg et c'est la que le problème survient, il m'affiche bien toutes les colonnes excepté la colonne du libproduit (pour une raison inconnu, aucune exception n'est levée).

Cependant quand je spécifie dans ma requete que je ne veut afficher que la colonne libproduit, il me l'affiche sans aucun soucis ...

Je suis dans une impasse je vois pas trop d'ou peut venir le problème, avez-vous des idées ?

23 réponses

H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 13:49
Ok je vais chercher, merci de ton aide en tout cas

H4rDBuG
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 16:05
c'est encore moi, je viens de passer l'aprem sur un nouveau code et ce coup-ci il boucle a l'infini et je vois vraiment pas d'ou ...

le code :

package gestionintendance;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import sun.jdbc.odbc.JdbcOdbcDriver;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.List;
import java.util.ArrayList;

public class tabProduit extends AbstractTableModel
{
   private static final long serialVersionUID = 1L;

   String[] colonnes = {"Référence Produit", "Libellé Produit", "Prix HT Produit", "Prix TTC Produit", "Catégorie", "Fournisseur"};
   //la liste du contenu du tableau 
   private List<Object[]> allLignes = new ArrayList<Object[]>();
   
   //public tabProduit(){}
   
   //constructeur avec la liste
   public tabProduit(List<Object[]> allLignes)
   {
      //test si la liste est vide rajouter une ligne vide
      if (allLignes == null || allLignes.size()<1)
      {
         allLignes.add(new Object[colonnes.length]);
      }
      this.allLignes = allLignes;
   }

   /* retourne le nombre d'element de la colonne */
   public int getColumnCount() 
   {
      return colonnes.length;
   }

   /* retourne le nombre de lignes */
   public int getRowCount() 
   {
      return allLignes.size();
   }

   /* retourne le nom de la colonne */
   public String getColumnName(int col) 
   {
      return colonnes[col];   
   }
   
   /* retourne la valeur à la ligne row et colonne col */
   public Object getValueAt(int row, int col) 
   {
      return allLignes.get(row)[col];
   }

   public Class<?> getColumnClass(int c) 
   {
      return getValueAt(0, c).getClass();
   }

   /* definie les cellules éditables ou non */
   public boolean isCellEditable(int row, int col) 
   {
         return false;
   }
   
   /* permet de modifier l'element en placant value a la ligne row 
   colonne col */
   public void setValueAt(Object value, int row, int col) 
   {
      allLignes.get(row)[col] = value;
      fireTableCellUpdated(row, col); // on signal un changement
   }
   
   //Rempli le tableau
   public void remplie(List<Object[]> lignes)
   {
      allLignes = lignes;
      //On signale le changement des données aux listeners :
      fireTableDataChanged();
   }
   
   //Vide la table
   public void vide()
   {
      allLignes.removeAll(allLignes);
      fireTableRowsDeleted(0,getRowCount());
   }   
      
   public tabProduit()
   {
      tabProduit tabProduit = new tabProduit();      
      JTable jTable = new JTable(tabProduit);
      List<Object[]> donnees = new ArrayList<Object[]>();
      
      JFrame frame = new JFrame("Consultation des produits");
      JScrollPane scroll = new JScrollPane(jTable);
      frame.setSize(900,400);
      frame.add(scroll);
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      try
      {
         Statement stmt = (Statement) new BDD().conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
         String req = "SELECT RefProduit, LibProduit, PrixHTProduit, PrixTTCProduit, NomCateg, NomFourn"
                   + " FROM Produit"
                   + " WHERE Produit.NoCateg = Categorie.NoCateg"
                   + " AND Produit.NoFourn = Fournisseur.NoFourn"
                   + " ORDER BY RefProduit;";
         ResultSet rs = stmt.executeQuery(req);
         tabProduit.vide();
         while(rs.next())
         {      
            
            ResultSetMetaData rsmd = rs.getMetaData();
            int ncols = rsmd.getColumnCount();
            //Remise du curseur à sa position initiale
            rs.beforeFirst();
               Object val [] = new Object[ncols];
               for(int j=1; j<=ncols; j++)
                  val[j-1] = rs.getString(j);
               donnees.add(val);
         }     
            ((tabProduit)jTable.getModel()).remplie(donnees);   
            //Remise du curseur à sa position initiale
         
      }catch(Exception e){System.out.println(e);}
   }
}
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 16:06
j'ai oublié la trace de l'erreur :

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at gestionintendance.tabProduit.(tabProduit.java:99)
at gestionintendance.tabProduit.(tabProduit.java:100)
at gestionintendance.tabProduit.(tabProduit.java:100)
.
.
.

il boucle a l'infini :/
0
Rejoignez-nous