Инвертировать выделение в JTable - PullRequest
3 голосов
/ 20 января 2010

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

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

Ответы [ 5 ]

2 голосов
/ 20 июля 2011

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

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}
2 голосов
/ 16 марта 2010

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;
        }
    }
}
0 голосов
/ 25 августа 2015

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

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

/**
 * 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);
}
0 голосов
/ 20 января 2010

Нет, вам нужно будет реализовать cutsom ListSelectionListener

0 голосов
/ 20 января 2010

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

...