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

pek*_*pek 12 java jtable

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

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后我使用基本的自定义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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个自定义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());
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Osc*_*Ryz 31

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

你必须使用:

JTable.convertRowIndexToModel(int viewIndex)

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

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

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

  • @Carl Smoticz:我认为自Java 1.6以来 (3认同)