2010-01-20 6 views
3

En cliquant sur un bouton, je souhaite que les lignes sélectionnées soient inversées (les lignes non sélectionnées doivent être sélectionnées et les lignes sélectionnées ne doivent pas être sélectionnées).Inverser la sélection dans JTable

Y at-il une méthode intégrée dans JTable pour le faire?

+0

Ajoutez votre solution en réponse à voter en: D –

Répondre

2

JTable ne semble pas avoir un moyen intégré de le faire. Je l'ai donc implémenté avec le code suivant. (Espérons que cela est utile pour quelqu'un qui fait face à un problème similaire.)

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

JTable n'a pas cette fonctionnalité

2

Pour simplifier la solution de Sudar:

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

Notez que dans le cas des plus grandes tables, propriété valueIsAdjusting de ListSelectionModel aide un peu avec la performance. – Touko

0

Un raffinement ci-dessus est de mettre à jour la sélection en utilisant l'objet modèle de sélection, pas objet de table. Lorsque vous mettez à jour la sélection via la table, chaque mise à jour déclenche un événement de modification de sélection et la mise à jour d'une table avec quelques centaines de lignes prend quelques secondes.

Le moyen le plus rapide pour les tables avec plus de quelques centaines de lignes est ce

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