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

Java 在模型更新期间,在已排序的JTable中保留选定的模型行,java,swing,jtable,tablerowsorter,Java,Swing,Jtable,Tablerowsorter,如果JTable已被排序,我很难获得以下代码来保留模型中逻辑上选定的行 当不应用排序时,它按预期工作 private void updateAccountTable() { accountsTable = guiFrame.getAccountsTable(); // Preserve selected model row String accountNumber = ""; int selectedRow = accountsTable.getSelected

如果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();
    }
}
private void updateAccountTable(){
accountsTable=guiFrame.getAccountsTable();
//保留选定的模型行
字符串accountNumber=“”;
int selectedRow=accountsTable.getSelectedRow();
如果(selectedRow>=0){
accountNumber=(字符串)accountsTable.getValueAt(selectedRow,0);
}
//保留排序顺序
//让eclipse开心。更好的方法??

列表从
getSelectedRow()
中获取的
位于视图坐标中,而模型坐标已通过中间的更新进行了更改。引用相关:

除非通过对列进行排序、筛选或用户操作来重新排列查看的数据,否则这种区别并不重要

您将需要使用接近结尾处描述的转换方法,这表明:

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


当您单击Jtable标题对其进行排序,并单击一行(例如第3行)时,您将获得未排序的Jtable行的值。为避免这种情况,请使用此LOC。(ik这与您尝试执行的操作无关,但对于其他具有类似问题的操作)

我的表是这样的,我正在尝试获取所选行的用户名,并且没有第二个LOC,即使在排序之后,我也会获取未排序的JTable的行值:

---------------------
|  id    |   username |
---------------------
|        |            | 

getSelectedRow()仅用于填充selectedRow,以便在一开始就填充accountNumber变量。这一切都发生在视图上下文中。用于尝试和设置选择间隔的行变量是一个循环变量,在数据更改后也在视图上下文中。setRowSelectionInterval是否希望在该模式中有行号l上下文?不,这是一个表(视图)方法;对(更新的)模型的搜索应该会找到一个匹配的键。在调试时要记住转换索引的需要。为了更快地获得更好的帮助,请发布一个.Fair point。此URL是否仍然有效?此URL(以及指向sscce.org的所有其他链接)无法为meSorry加载,SSCCE服务器目前有点不可靠。我正在研究它。
---------------------
|  id    |   username |
---------------------
|        |            |