2010-11-30 9 views
2

Je veux étendre le DefaultTableModel et modifier son dataVector. Je veux faire le dataVector pour afficher uniquement les champs spécifiques de DataHolder dans la colonne:Comment sous-classer DefaultTableModel et modifier son dataVector

public class MyTableModel extends DefaultTableModel { 

    /** 
    * The data vector 
    */ 
    private Vector<DataHolder> dataVector_; 

    //overridden method to add row in the table model 
    public void addRow(DataHolder rowData) { 
     insertRow(getRowCount(), rowData); 
    } 

    public void insertRow(int row, DataHolder rowData) { 
      dataVector_.insertElementAt(rowData, row); 
      fireTableRowsInserted(row, row); 
     } 

    ...} //end of MyTableModel 



    class DataHolder{ 
    private int age; 
    private int year; 
    private int month; 
    private int day; 
    } 

Comment afficher les champs de DataHolder spécifiques dans mon jtable? Ma table a 3 colonnes pour le mois, le jour et l'année. Voulez-vous changer cela dans le modèle de table ou dans la vue de table?

Répondre

1

Vous devez surcharger la méthode getValueAt(...):

@Override 
public Object getValueAt(int row, int column) { 
    DataHolder data = dataVector_.get(row); 
    switch(column) { 
     case 0: return data.month; 
     case 1: return data.day; 
     case 2: return data.year; 
     default: return null; 
    } 
+0

Merci. Cette méthode est-elle appelée par le moteur de rendu de la table lors de la mise à jour des données de la table, en particulier lors de l'appel de fireTableRowsInserted? – doku

+0

Cette méthode est toujours appelée, quand la table a changé fireTable ...() et quand la table est repeinte. – multiholle

0

Si vous utilisez un JTable pour la vue, puis-je suggérer de travailler avec le TableColumnModel qui est accessible via le JTable.

+0

Merci pour la suggestion, mais je veux changer dans le modèle de table. Tout ce que je veux savoir, c'est quelle méthode utiliser pour spécifier au modèle ce qu'il faut afficher depuis mon DataHolder. – doku

+0

Il y a plus d'une méthode que vous devez changer, c'est pourquoi vous devez écrire un nouveau TableModel. Le code que vous avez posté ne signifie rien et est complètement faux. Vous ne pouvez pas simplement changer le vecteur de données et oublier le vecteur d'en-tête. Toutes les méthodes du modèle fonctionnent ensemble. Créez un TableModel approprié et il sera plus facile à comprendre et à utiliser. – camickr

3

Vous devez créer un modèle personnalisé pour cela. Le DefaultTableModel n'est pas le meilleur endroit pour commencer.

Généralement, vous étendez AbstractTableModel et utilisez une ArrayList pour stocker vos objets DataHolder. Ensuite, vous devez implémenter les autres méthodes de l'interface TableModel. Le tutoriel Swing sur How to Use Tables vous montre les bases de la façon de procéder.

Ou vous pouvez utiliser le Bean Table Model qui fait tout le travail pour vous.

+0

Merci :) BeanTableModel va être tellement utile. Juste ce que j'étais sur le point de créer. – TheKojuEffect