Инвертировать выделение в JTable

При нажатии кнопки я хочу, чтобы выбранные строки были инвертированы (не выбранные строки должны быть выбраны, а выбранные строки не должны быть выбраны).

Есть ли встроенный метод в JTable для этого?


person Sudar    schedule 20.01.2010    source источник
comment
Добавьте свое решение в качестве ответа, чтобы за него проголосовали: D   -  person Mario Ortegón    schedule 16.03.2010


Ответы (5)


JTable, похоже, не имеет встроенного способа сделать это. Поэтому я реализовал его с помощью следующего кода. (Надеюсь, это будет полезно для тех, кто сталкивается с подобной проблемой.)

int[] selectedIndexs = jtable.getSelectedRows();
jtable.selectAll();

for (int i = 0; i < jtable.getRowCount(); i++) {
    for (int selectedIndex : selectedIndexs) {
        if (selectedIndex == i) {
            jtable.removeRowSelectionInterval(i, i);
            break;
        }
    }
}
person Sudar    schedule 16.03.2010

Чтобы упростить решение Судара:

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}
person nokul    schedule 20.07.2011
comment
Обратите внимание, что в случае больших таблиц свойство valueIsAdjusting модели ListSelectionModel немного повышает производительность. - person Touko; 21.10.2011

JTable не имеет такой функции.

person Peter    schedule 20.01.2010

Нет, вам придется реализовать обрезной ListSelectionListener.

person Pierre    schedule 20.01.2010

Уточнение вышеизложенного заключается в обновлении выбора с использованием объекта модели выбора, а не объекта таблицы. Когда вы обновляете выборку через таблицу, каждое обновление запускает событие изменения выборки, и для обновления таблицы всего с несколькими сотнями строк требуется несколько секунд.

Самый быстрый способ для таблиц с более чем несколькими сотнями строк - это

/**
 * Invert selection in a JTable.
 *
 * @param table
 */
public static void invertSelection(JTable table) {
    ListSelectionModel mdl = table.getSelectionModel();
    int[] selected = table.getSelectedRows();
    mdl.setValueIsAdjusting(true);
    mdl.setSelectionInterval(0, table.getRowCount() - 1);
    for (int i : selected) {
        mdl.removeSelectionInterval(i, i);
    }
    mdl.setValueIsAdjusting(false);
}
person Ayman    schedule 25.08.2015