1

如果 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() 无法更新选择,或者我错过了什么?

4

2 回答 2

2

row从中获得的是getSelectedRow()视图坐标,而模型坐标已被干预更新更改。引用相关教程部分

这种区别并不重要,除非您查看的数据已通过排序、过滤或用户对列的操作进行了重新排列。

您将需要使用排序和过滤末尾附近描述的转换方法,这表明:

使用分拣机时,请始终记住转换单元格坐标。

于 2012-07-03T03:41:48.283 回答
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 |
---------------------
|        |            | 
于 2017-11-09T08:47:47.833 回答