[jTable & HSQLDB] 1 seule ligne de la table affichée qui en contient plusieurs

Morpheusyz Messages postés 11 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 11 juin 2009 - 1 juin 2009 à 18:10
Morpheusyz Messages postés 11 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 11 juin 2009 - 10 juin 2009 à 16:33
Bonjour à tous !

Voici mon problème:
Dans une jTable, je souhaite affiché les données contenue dans uen base local (HSQL) même principe qu'avec MYSQL.
Cependant ma jTable n'affiche que la première ligne de ma table qui en contient 2. Ou est l'erreur?

## Application.java :

...
        CustomTableModel tab = new CustomTableModel(pilote,host,login,pw,sql);
        JTable T = new JTable(tab);
        T.setModel(tab);
        JScrollPane jsp= new JScrollPane(T);//ScrollPane
...

## CustomTableModel.java :

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class CustomTableModel extends DefaultTableModel  {
   
    public static SQLExecuteQuery connexion;
    private ResultSetMetaData md;
    private int colonnes;
    public Vector data;
    private String[] columnNames;
   
    // DefaultTableModel has its own internal storage; use that   
    public CustomTableModel(String pilote,String host,String login,String pw,String query)  { 
        connexion = new SQLExecuteQuery(pilote,host,login,pw);
        connexion.setQuery(query);
        getHSQLdb();
    }
   
    public void getHSQLdb() {
        try {
             ResultSet rs = connexion.getResultSet();
             md = rs.getMetaData();
             colonnes = md.getColumnCount();
             System.out.println(colonnes);
             columnNames = new String[colonnes];
             for (int i = 0; i <= colonnes-1; i++) {
                 columnNames[i] = md.getColumnLabel(i+1);
                 super.addColumn(columnNames[i]);
             }
            
             // Get all rows.
             System.out.println("Data:");
             data = new Vector();
             while (rs.next()) {
                 Vector newRow = new Vector();
                 for (int i = 1; i <= getColumnCount(); i++) {
                     newRow.addElement(rs.getObject(i));
                 }
                 data.addElement(newRow);
                 System.out.println(data);
             }
             super.addRow(data);
           
            
             //fireTableDataChanged();
           } catch (Exception ex) {
               JOptionPane.showMessageDialog(null, "Erreur : " + ex, "Warning", JOptionPane.ERROR_MESSAGE);
           }
    }
   
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        Vector vect = (Vector)data.elementAt(row);
        System.out.println(vect.elementAt(col));
        return vect.elementAt(col);
    }

    public boolean isCellEditable(int row,int column) {
        return true;
    }

    // let's use DefaultTableModel's own getRowCount implementation  
    // and getValueAt 
    // there is no clear method, so let's add this one    
    public void clear()  { 
        // setting the number of rows to 0 also clears the model 
        setRowCount(0); 
    } 
A voir également:

3 réponses

Morpheusyz Messages postés 11 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 11 juin 2009
2 juin 2009 à 09:49
Aucune idée de l'oeil expert d'un sioux du java? :)
0
manlap Messages postés 17 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 juin 2010
2 juin 2009 à 14:53
Bonjour,

super.addRow(data) permet d'ajouter une seule ligne

il faudrait plutôt faire 

             // Get all rows.
             System.out.println("Data:");
             while (rs.next()) {
                 Vector newRow = new Vector();
                 for (int i = 1; i <= getColumnCount(); i++) {
                     newRow.addElement(rs.getObject(i));
                 }
                 super.addRow(newRow);
             }

ou alors utiliser la méthode setDataVector de DefaultTableModel

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/DefaultTableModel.html
0
Morpheusyz Messages postés 11 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 11 juin 2009
10 juin 2009 à 16:33
Merci en effet le problème venait du fait que le addRow se situait en dehors de la boucle while:

J'ai résolu mon problème avec ceci:

             // Get all rows.
             data = new Vector();
             while (rs.next()) {
                 Vector newRow = new Vector();
                 for (int i = 1; i <= getColumnCount(); i++) {
                     newRow.addElement(rs.getObject(i));
                 }
                 data.addElement(newRow);
             }
0
Rejoignez-nous