Сохранить выбранную строку модели в отсортированном JTable при обновлении модели

У меня возникают трудности с получением следующего кода для сохранения логически выбранной строки в модели, если 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 ответа

row получен из getSelectedRow() находится в координатах вида, в то время как координаты модели были изменены последующим обновлением. Цитирование из соответствующего учебного раздела:

Это различие не имеет значения, если только просматриваемые данные не были переупорядочены путем сортировки, фильтрации или манипулирования пользователем столбцов.

Вам нужно будет использовать методы преобразования, описанные в конце Сортировки и фильтрации, которые предлагают:

При использовании сортировщика всегда не забывайте переводить координаты ячейки.

Если щелкнуть заголовок 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();

Моя таблица выглядит следующим образом, и я пытаюсь получить имя пользователя выбранной строки и без 2-го LOC, я получу значение строки несортированной JTable даже после сортировки:

---------------------
|  id    |   username |
---------------------
|        |            | 
Другие вопросы по тегам