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?

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top