在模型更新中保留已排序JTable中的选定模型行

时间:2012-07-03 02:22:49

标签: java swing jtable tablerowsorter

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

2 个答案:

答案 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 |
---------------------
|        |            |