J'ai un certain nombre de JXTables qui ont tous les mêmes colonnes (mais des données différentes). Vous pouvez trier les données en cliquant sur l'en-tête de l'une des colonnes. Ce que je veux maintenant, c'est que les autres tables sont triées de la même manière en cliquant sur l'en-tête de l'une des tables.JXTable écouter pour trier et trier une table similaire de la même manière
Répondre
Vous pouvez définir une classe de médiateurs faisant référence à chacun des RowSorter
de JTable
et s'enregistrer comme RowSorterListener
avec chaque trieur. Lorsqu'un trieur donné change, vous pouvez récupérer sa liste actuelle de clés de tri en utilisant getSortKets()
et les transmettre à tous les autres trieurs en utilisant setSortKeys(List<? extends SortKey>)
.
Exemple
Nous définissons d'abord la classe de médiateur:
public class SortMediator implements RowSorterListener {
private final List<RowSorter> sorters;
private boolean changing;
public void addRowSorter(RowSorter sorter) {
this.sorters.add(sorter);
}
public void sorterChanged(RowSorterEvent e) {
...
}
}
Maintenant, nous mettons en œuvre sorterChanged(RowSorterEvent e)
pour répondre à un événement trieuse donné:
public void sorterChanged(RowSorterEvent e) {
// The changing flag prevents an infinite loop after responding to the inital
// sort event.
if (!changing) {
changing = true;
RowSorter changedSorter = e.getSource();
List<? extends SortKey> keys = changedSorter.getKeys();
for (RowSorter sorter : sorters) {
if (sorter != changedSorter) {
// Install new sort keys, which will cause the sorter to re-sort.
// The changing flag will prevent the mediator from reacting to this.
sorter.setSortKeys(keys);
}
}
}
}
Je ne ferais pas ça, car il prend le contrôle de l'utilisateur: il peut vouloir que les tables soient triées différemment, pour comparer les différentes pi des données.
Ajoutez à la place une option "Trier par" dans votre menu Affichage. La modification de cette option permet de trier toutes les tables, mais de les laisser à moins que l'utilisateur ne souhaite trier une table spécifique.
Il y a des cas où il est important de garder deux tables triées de la même manière; par exemple, j'ai utilisé cette approche lors de la construction d'une vue "diff" composée d'un JTable gauche et droit où les barres de défilement et les ordres de tri doivent rester synchronisés. – Adamski
Bien sûr, il y a des moments où cela est utile. Mais la plupart du temps c'est une très mauvaise idée du point de vue de l'expérience utilisateur. Il viole le "principe du moindre étonnement". – kdgregory
Le problème est que la table ne semble pas avoir de rangs. Même le 'sortManager' est nul. Cependant, le tri fonctionne lorsque je clique sur l'en-tête de la colonne. – Fortega
Je pense que c'est parce que c'est un JXTable. Je pensais que le tri était géré par la Table, mais je ne suis plus sûr maintenant. – Fortega
Ah désolé - Je n'ai pas remarqué que c'était JXTable. Si vous utilisez JDK 1.6, je vous recommande de passer à JTable, ce qui vous donne un meilleur tri. – Adamski