Inverter a seleção em jtable
Pergunta
Ao clicar em um botão, quero que as linhas selecionadas sejam invertidas (linhas não selecionadas devem ser selecionadas e linhas selecionadas devem ser não selecionadas).
Existe um método de construção em jtable para fazer isso?
Solução
O JTABLE não parece ter uma maneira interna de fazer isso. Então, eu o implementei com o código a seguir. (Espero que isso seja útil para alguém que esteja enfrentando um problema semelhante.)
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;
}
}
}
Outras dicas
Para simplificar a solução de Sudar:
int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
table.removeRowSelectionInterval(prevSel, prevSel);
}
JTable não tem esse recurso
Não, você terá que implementar um corte ListSelectionListener
Um refinamento acima é atualizar a seleção usando o objeto de modelo de seleção, não o objeto de tabela. Quando você atualiza a seleção através da tabela, cada atualização dispara um evento de mudança de seleção e leva alguns segundos para atualizar uma tabela com apenas algumas centenas de linhas.
A maneira mais rápida de mesas com mais de algumas centenas de linhas é essa
/**
* 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);
}