正确地从(已排序的)JTable获取数据

我已经开发了一个基本的自定义JTableModel,如下所示

public class CustomTableModel extends DefaultTableModel { List data; public CustomTableModel(List data) { this.data = data; } public Class getColumnClass(int columnIndex) { return MyClass.class; } public MyClass getValueAt(int rowIndex, int columnIndex) { return data.get(rowIndex); } // ... } 

然后我使用基本的自定义JTableCellRenderer,如下所示

 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; } } 

我还有一个自定义JPanel,显示如下各种信息

 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()); // ... } } 

最后,我使用表格列出我的数据和自定义面板以显示所选数据的详细信息。

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

我想要完成的是从表中获取所选的MyClass,而不管排序

我尝试了ListSelectionListener,但方法不返回除选定索引之外的任何内容。 即使我有索引,如果表被排序,我的模型也不是那么复杂并且会返回错误的对象。

…即使我有索引,如果表被排序,我的模型也不是那么复杂,会返回错误的对象……

你必须使用:

JTable.convertRowIndexToModel(int viewIndex)

根据视图将行的索引映射到基础TableModel。 如果未对模型的内容进行排序,则模型和视图索引是相同的。

使用该索引,您可以访问表模型并查看所需的对象。

注意在Java 1.6中引入了表格排序以及此方法