2010-01-20 2 views
3

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

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

+0

Добавить свое решение в ответ на голосование вверх: D –

ответ

2

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; 
     } 
    } 
} 
2

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

int[] selectedIndices = table.getSelectedRows(); 
table.selectAll(); 
for (int prevSel : selectedIndices) { 
    table.removeRowSelectionInterval(prevSel, prevSel); 
} 
+2

Обратите внимание, что в случае больших таблиц, valueIsAdjusting свойство ListSelectionModel помогает немного с производительностью. – Touko

0

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

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

/** 
* 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); 
}