从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
提供了从“视图行索引”转换为“模型行索引”的方法,反之亦然。这些方法被命名为convertRowIndexToModel
和convertRowIndexToView
。
在mouseClicked处理程序中,您需要调用函数convertRowIndexToModel
,如下所示:
if (bookTable.getSelectedRow() >= 0){
Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
setBook(book);
}
问题是您将数据存储在两个地方:
数据应仅存储在TableModel中。这样您就不必担心同步数据,因为它只在一个地方。
您可以使用JTable的getValueAt(..)方法从所选行中创建Book对象。您需要为表中的每个列调用该方法。
或者另一种方法是创建一个包含Book对象的自定义TableModel,然后您可以直接从表中获取Book对象。这是一项更多的工作,但这是更好的方法。
查看Row Table Model,了解如何为自定义对象创建自定义TableModel的分步方法。