Invertir la selección en JTable
Pregunta
Al hacer clic en un botón, quiero las filas seleccionadas para ser invertidas (filas no seleccionadas deben seleccionarse y filas seleccionadas deben ser no seleccionado).
¿Hay una acumulación en el método en el JTable para hacerlo?
Solución
JTable no parece tener una forma integrada de de hacer esto. Así que he implementado con el siguiente código. (Hope que esto sea útil para alguien que se enfrenta a un problema similar.)
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;
}
}
}
Otros consejos
Para simplificar la solución de Sudar:
int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
table.removeRowSelectionInterval(prevSel, prevSel);
}
JTable no tiene esa característica
No, usted tendrá que poner en práctica un cutsom ListSelectionListener
Un refinamiento anteriormente es a la selección actualización utilizando el objeto de modelo de selección, no el objeto de tabla. Al actualizar la selección a través de la mesa, cada actualización dispara un evento de cambio de la selección y se tarda unos segundos para actualizar una tabla con sólo unos pocos cientos de filas.
La forma más rápida para tablas con más de unos pocos cientos de filas es la siguiente
/**
* 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);
}