使用RowSorter时如何获取JTable上的数据?
How to get data on JTable when using RowSorter?
我在从 JTable
中选择一行时获取数据时遇到问题。每当我启用 table 的 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);
}...
当我单击 header table 对数据进行排序时,我现在有不明确的数据。
JTable
实例上的选定行号始终是视图端 上选定的行号。
如果您激活行排序器,这将不再匹配模型端的行号。
为了在这两个行号之间进行转换,JTable
提供了从 "view row index" 转换为 "model row index" 的方法,反之亦然。这些方法被命名为 convertRowIndexToModel
和 convertRowIndexToView
.
在您的 mouseClicked 处理程序中,您需要按如下方式调用函数 convertRowIndexToModel
:
if (bookTable.getSelectedRow() >= 0){
Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
setBook(book);
}
问题是您将数据存储在两个地方:
- 在表模型中
- 在 ArrayList 中
数据应该只存储在 TableModel 中。这样您就不必担心同步数据,因为它只在一个地方。
您可以简单地使用 JTable 的 getValueAt(..) 方法从选定的行创建一个 Book 对象。您需要为 table.
中的每一列调用该方法
或者另一种方法是创建一个包含 Book 对象的自定义 TableModel,然后您可以直接从 table 中获取 Book 对象。这需要更多工作,但这是更好的方法。
查看 Row Table Model 以了解有关如何为自定义对象创建自定义 TableModel 的分步方法。
我在从 JTable
中选择一行时获取数据时遇到问题。每当我启用 table 的 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);
}...
当我单击 header table 对数据进行排序时,我现在有不明确的数据。
JTable
实例上的选定行号始终是视图端 上选定的行号。
如果您激活行排序器,这将不再匹配模型端的行号。
为了在这两个行号之间进行转换,JTable
提供了从 "view row index" 转换为 "model row index" 的方法,反之亦然。这些方法被命名为 convertRowIndexToModel
和 convertRowIndexToView
.
在您的 mouseClicked 处理程序中,您需要按如下方式调用函数 convertRowIndexToModel
:
if (bookTable.getSelectedRow() >= 0){
Book book = books.get(bookTable.convertRowIndexToModel(bookTable.getSelectedRow()));
setBook(book);
}
问题是您将数据存储在两个地方:
- 在表模型中
- 在 ArrayList 中
数据应该只存储在 TableModel 中。这样您就不必担心同步数据,因为它只在一个地方。
您可以简单地使用 JTable 的 getValueAt(..) 方法从选定的行创建一个 Book 对象。您需要为 table.
中的每一列调用该方法或者另一种方法是创建一个包含 Book 对象的自定义 TableModel,然后您可以直接从 table 中获取 Book 对象。这需要更多工作,但这是更好的方法。
查看 Row Table Model 以了解有关如何为自定义对象创建自定义 TableModel 的分步方法。