[JAVA] JTable, pb getValueAt IndexOutOfBounds

Résolu/Fermé
Nargonath Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 27 avril 2010 - 26 avril 2010 à 14:24
Nargonath Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 27 avril 2010 - 27 avril 2010 à 08:57
Bonjour,

J'ai un problème avec mon JTable. J'utilise une classe toute simple de données (3 attributs et les accesseurs qui vont avec) pour remplir mon JTable. Pour stocker les données de mon tableau j'utilise une liste d'objet de ma classe de données.
Or, dès que je lance mon application l'affichage plante. Voici le code de ma partie view :
// create the JTable
        String[] title = {"Name", "Type", "Type_ID"};
        SlowControlRow[] dataTable = { new SlowControlRow("", "", 0) };
        this.table = new JTable(new TableModelObject(title, dataTable));
        // set 3 first columns behavior
        this.table.getColumn("Name").setCellEditor(new DefaultCellEditor(new JTextField()));
        this.table.getColumn("Type").setCellEditor(new DefaultCellEditor(new JTextField()));
        this.table.getColumn("Type_ID").setCellEditor(new DefaultCellEditor(new JTextField()));


Je vous exempt du setVisible & co. ;)

Ensuite, lors du chargement de mon tableau celui-ci fait appel à la méthode getValueAt (normal me direz vous ! ). Cependant, il y fait appel deux fois en incrémentant l'index de la ligne. Voici l'erreur avec un affichage de l'index de ligne et de colonne dans getValueAt :
col : 0 row : 0
col : 0 row : 1
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at java.util.ArrayList.get(ArrayList.java:322)
        at bookeeping.control.table.TableModelObject.getValueAt(TableModelObject.java:79)
        at javax.swing.JTable.getValueAt(JTable.java:2686)
[...]


Je ne comprends pas pourquoi il essaye d'accéder à la deuxième ligne de la liste alors que dans la variable data que je passe au constructeur de mon modèle, il n'y a qu'une seule ligne.
J'ai fais des tests de mesure de la longueur de ma liste, le résultat est toujours 1.

En prime, voici le code de ma classe TableModelObject :
public class TableModelObject extends AbstractTableModel {
 
    private List<SlowControlRow>  data = new ArrayList<SlowControlRow>();
    private final String[] title;
 
    /**
     * Constructs an table object model with title and data.
     * @param title
     *          The array containing all titles.
     * @param data
     *          An array of SlowControlRow.
     */
    public TableModelObject(String[] title, SlowControlRow[] data) {
        this.title = title;
        for(SlowControlRow value : data) 
            this.data.add(value);
            
    }
 
    /**
     * Returns the rows number.
     * @return
     *      The rows number.
     */
    public int getRowCount(){
        return this.data.size();
    }
 
    /**
     * Returns the columns number.
     * @return
     *      The columns number.
     */
    public int getColumnCount() {
        return this.title.length;
    }
 
    /**
     * Returns the column name corresponding to the column index.
     * @param col
     *      Column index.
     * @return
     *      Column name.
     */
    @Override
    public String getColumnName(int col){
        return this.title[col];
    }
 
    /**
     * Returns the value corresponding to the column index and the row index.
     * @param col
     *       The column index.
     * @param row
     *       The row index.
     * @return
     *       Tha value which matches.
     */
    @Override
    public Object getValueAt(int col, int row) {
        System.out.println("col : "+col+" row : "+row);
        switch(col) {
            case 0 :
                return this.data.get(row).getName();
            case 1 :
                return this.data.get(row).getType();
            case 2 :
                return this.data.get(row).getType_id();
            default :
                return null;
 
        }
    }
 
    /**
     * Inserts a row in the table.
     * @param newData
     *          The row to be inserted.
     */
    public void addRow(SlowControlRow newData) {
        this.data.add(newData);
 
        fireTableRowsInserted(this.data.size()-1, this.data.size()-1);
    }
 
    /**
     * Removes rows in the dataTable
     * @param row
     *        The row to be deleted.
     */
    public void removeRow(int row) {
        this.data.remove(row);
 
        fireTableRowsDeleted(row, row);
    }
 
}


getValueAt étant appelé à chaque rafraichissement du tableau, il ne devrait chercher que la ligne 0 de ma liste et pas essayer d'aller au delà non ? Vu que ma List data ne contient qu'un seul objet ( par conséquent qu'une seule ligne).
Si quelqu'un connait la cause du problème :D . J'ai googler mon problème mais je n'ai pas trouvé de réponses.

Cdlt,


A voir également:

1 réponse

Nargonath Messages postés 4 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 27 avril 2010
27 avril 2010 à 08:57
Problème résolu.
J'ai inversé les index de colonnes et de ligne dans la signature de la fonction getValueAt. Voilà.

Cdlt,
0