2010-01-15 4 views
12

j'ai développé un JTableModel de mesure de base comme suitcorrectement obtenir des données à partir d'un (trié) JTable

public class CustomTableModel extends DefaultTableModel { 
    List<MyClass> data; 
    public CustomTableModel(List<MyClass> data) { 
    this.data = data; 
    } 

    public Class<?> getColumnClass(int columnIndex) { 
    return MyClass.class; 
    } 

    public MyClass getValueAt(int rowIndex, int columnIndex) { 
    return data.get(rowIndex); 
    } 

    // ... 
} 

J'utilise ensuite un JTableCellRenderer de base de mesure comme suit

public class CustomTableCellRenderer extends JLabel implements TableCellRenderer { 

    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 

    MyClass myClass = (MyClass)value; 

    lbl.setText(myClass.getString()); 

    return this; 
    } 
} 

J'ai aussi un JPanel personnalisés qui affiche diverses informations comme suit

public class MyPanel extends JPanel { 
    private MyClass myClass; 

    public MyPanel(MyClass myClass) { 
    // initialize components 
    } 

    public setMyClass(MyClass myClass) { 
    this.myClass = myClass; 
    updateFields(); 
    } 

    private void updateFields() { 
    this.fieldString.setText(myClass == null ? "" : myClass.getString()); 
    // ... 
    } 
} 

Enfin, j'utilise un tableau pour lister mes ata et le panneau personnalisé pour afficher les détails des données sélectionnées.

public class JCustomFrame extends JFrame { 
    public JCustomFrame(List<MyClass> data) { 
    // ... 
    JTable table = new JTable(new CustomTableModel(data)); 
    table.setDefaultRenderer(MyClass.class, new CustomTableCellRenderer()); 

    } 
} 

Ce que je suis en train d'accomplir est d'obtenir les MyClass sélectionnés de la table quel que soit le tri.

J'ai essayé ListSelectionListener mais les méthodes ne retournent rien d'autre que les index sélectionnés. Même si j'ai l'index, si la table est triée, mon modèle n'est pas si sophistiqué et retournera le mauvais objet.

Répondre

30

... Même si je l'index, si la table est triée, mon modèle est pas si sophistiqué et retourne le mauvais objet ...

Vous devez utiliser:

JTable.convertRowIndexToModel(int viewIndex)

Carte de l'indice de la ligne en fonction de la vue de la TableModel sous-jacente. Si le contenu du modèle n'est pas trié, les indices de modèle et de vue sont les mêmes.

Avec cet index, vous pouvez accéder à votre modèle de table et voir quel est l'objet dont vous avez besoin.

Remarque Table de tri ainsi que cette méthode a été introduite en Java 1.6

+1

Vous pouvez obtenir un JTable pour afficher les données triées différemment du modèle sous-jacent? Comment faites-vous pour trier, et quand a-t-il été introduit? –

+3

@Carl Smoticz: depuis Java 1.6 je pense – OscarRyz

Questions connexes