使用行排序器时如何获取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);
}...

当我单击标题表对数据进行排序时,我现在有模糊的数据。

JTable实例上的选定行号始终是视图侧的选定行号。

如果激活行排序器,则不再与模型侧的行号匹配。

为了在这两个行号之间进行转换,JTable提供了从"查看行索引"转换为"模型行索引"的方法,反之亦然。这些方法命名为convertRowIndexToModelconvertRowIndexToView

在鼠标单击处理程序中,您需要调用函数convertRowIndexToModel如下所示:

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

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

  1. 在表中模型
  2. 在数组列表中

数据应仅存储在表模型中。这样,您无需担心同步数据,因为它仅在一个地方。

您可以简单地使用 JTable 的 getValueAt(..( 方法从所选行创建一个 Book 对象。您需要为表中的每一列调用该方法。

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

查看行表模型,了解如何为自定义对象创建自定义表模型的分步方法。