2010-01-14 16 views

Répondre

4

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

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

+0

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

+0

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

0

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.

+0

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

+1

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