Invertire la selezione in JTable
Domanda
Su clic su un pulsante, voglio che le righe selezionate da invertire (le righe non selezionate dovrebbero essere selezionati e le righe selezionate devono essere non-selezionata).
Esiste un metodo build-in in JTable per farlo?
Soluzione
JTable non sembra avere un built-in modo di fare questo. Così ho implementato con il seguente codice. (Spero che questo è utile per chi si trova ad affrontare un problema simile.)
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;
}
}
}
Altri suggerimenti
Per semplificare la soluzione di Sudar:
int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
table.removeRowSelectionInterval(prevSel, prevSel);
}
JTable non ha questa funzione
No, Si dovrà implementare un cutsom ListSelectionListener
Un perfezionamento sopra è aggiornare selezione usando l'oggetto modello di selezione, non l'oggetto tabella. Quando si aggiorna la selezione tramite la tabella, ogni aggiornamento spara un evento di modifica selezione e ci vogliono pochi secondi per aggiornare una tabella con poche centinaia di righe.
Il modo più veloce per le tabelle con più di qualche centinaio di righe è questo
/**
* 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);
}