Сохранить выбранную строку модели в отсортированном 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() не обновляет выбранную строку, как ожидалось, несмотря на то, что вызывается с правильным номером строки представления. Кажется, ничего не делать.

.....So,

Почему setRowSelectionInterval() не обновляет выделение или что я пропустил?


person TaninDirect    schedule 03.07.2012    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 03.07.2012
comment
Честная оценка. Этот URL все еще действителен? Эта (и все остальные ссылки на sscce.org) у меня не загружаются   -  person TaninDirect    schedule 04.07.2012
comment
Извините, сервер SSCCE в данный момент немного сомнительный. Изучаю это.   -  person Andrew Thompson    schedule 04.07.2012


Ответы (2)


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

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

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

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

person trashgod    schedule 03.07.2012
comment
getSelectedRow() используется только для заполнения selectedRow, чтобы заполнить переменную accountNumber в самом начале. Все это происходит в контексте представления. Переменная строки, используемая для установки интервала выбора, представляет собой переменную цикла, которая также находится в контексте представления после изменения данных. Ожидает ли setRowSelectionInterval номер строки в контексте модели? - person TaninDirect; 03.07.2012
comment
Нет, это табличный (представленный) метод; поиск (обновленной) модели должен найти соответствующий ключ. При отладке следует помнить о необходимости преобразования индексов. - person trashgod; 03.07.2012

Когда вы щелкаете заголовок 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 |
---------------------
|        |            | 
person realpac    schedule 09.11.2017