如果JTable已经排序,我在获取以下代码时难以保留模型中逻辑上选定的行。
在未应用排序时,它可以正常工作。
private void updateAccountTable() {
accountsTable = guiFrame.getAccountsTable();
// Preserve selected model row
String accountNumber = "";
int selectedRow = accountsTable.getSelectedRow();
if(selectedRow >= 0){
accountNumber = (String)accountsTable.getValueAt(selectedRow, 0);
}
// Preserve sort order
// Keep eclipse happy. better way??
List <? extends SortKey> keys = accountsTable.getRowSorter().getSortKeys();
// Update displayed accounts
DefaultTableModel model = (DefaultTableModel) accountsTable.getModel();
model.getDataVector().clear();
Object[][] tableContents = accountList.getAccountsAsArray(true);
model.setDataVector(tableContents, tableHeaders);
model.fireTableDataChanged();
// reset sort order
accountsTable.getRowSorter().setSortKeys(keys);
// If updated model contains previously selected account, reselect
if (!accountNumber.equals("") && null != accountList.getAccount(accountNumber)){
for (int row=0; row<accountsTable.getRowCount(); row++){
String an = (String)accountsTable.getValueAt(row, 0);
if (an.equalsIgnoreCase(accountNumber)){
accountsTable.setRowSelectionInterval(row, row);
break;
}
}
}
else {
accountsTable.clearSelection();
}
}
不幸的是,尽管使用正确的视图行号调用,但setRowSelectionInterval()并未按预期更新所选行。它似乎什么都不做。
.....所以,
为什么setRowSelectionInterval()无法更新选择,或者我错过了什么?
答案 0 :(得分:2)
从row
获取的getSelectedRow()
位于视图坐标中,而模型坐标已由插入更新更改。引自相关的tutorial section:
除非您通过对列进行排序,过滤或用户操作重新排列了所查看的数据,否则此区别无关紧要。
您需要使用Sorting and Filtering末尾附近描述的转化方法,建议:
使用分拣机时,请务必记住转换单元格坐标。
答案 1 :(得分:0)
当您单击Jtable标题对其进行排序,然后单击一行(例如第3行)时,您将获得未排序的JTable行的值。为了避免这种情况,请使用此LOC。(对于您正在尝试做的事情,这是不可避免的,但对于其他类似问题的人来说)
int row = tblUser.getSelectedRow();
//Without below line, the value you get would be the row before sorting
int correctModel = tblUser.convertRowIndexToModel(row);
//Get username and use it to find its corresponding tuple
String username = (tblUser.getModel().getValueAt(correctModel, 1)).toString();
我的表看起来像这样,我试图获取所选行的用户名而没有第二个LOC,即使在排序后我也得到未排序的JTable的行值:
---------------------
| id | username |
---------------------
| | |