使用RowSorter时如何在JTable上获取数据?

时间:2018-09-16 10:38:36

标签: java swing jtable

JTable中选择一行时,获取数据时遇到问题。每当我启用表的setAutoCreateRowSorter(true)时,就会发生这种情况。到目前为止,这是我所做的:

private void displayBooks(){
    bookTable.setAutoCreateRowSorter(true);
    bookTable.getTableHeader().setFont(new java.awt.Font("Century Gothic", 1, 14));
    dtm = (DefaultTableModel) bookTable.getModel();
    clearTable(dtm);
    for(Book book: books){
        dtm.addRow(new Object[]{book.getId(), ...//rest of the code
    }
}

bookTableMouseClicked方法上,这就是我所做的:

 ...
 if(bookTable.getSelectedRow() >= 0){
     Book book = books.get(bookTable.getSelectedRow());
        setBook(book);
 }...

当我单击标题表对数据进行排序时,我现在的数据不明确。

2 个答案:

答案 0 :(得分:3)

JTable实例上选择的行号始终是在视图侧选择的行号

如果激活行排序器,它将不再与模型端的行号匹配。

要在这两个行号之间进行转换,JTable提供了从“视图行索引”转换为“模型行索引”的方法,反之亦然。这些方法分别命名为convertRowIndexToModelconvertRowIndexToView

在mouseClicked处理程序中,您需要按以下方式调用函数convertRowIndexToModel

if (bookTable.getSelectedRow() >= 0){
    Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
    setBook(book);
}

答案 1 :(得分:0)

问题是您将数据存储在两个位置:

  1. 在TableModel中
  2. 在ArrayList中

数据仅应存储在TableModel中。这样,您就不必担心数据同步,因为它只在一个地方。

您只需使用JTable的getValueAt(..)方法从选定的行中创建Book对象。您将需要为表中的每一列调用该方法。

或者另一种方法是创建一个包含Book对象的自定义TableModel,然后您可以直接从表中获取Book对象。这还需要做更多的工作,但这是更好的方法。

请查看Row Table Model,以获取有关如何为自定义对象创建自定义TableModel的分步方法。