Vues tri et de filtrage: GlazedList tri et de filtrage + JTable vs liste d'événements baie vitrée + JXTable

StackOverflow https://stackoverflow.com/questions/7833179

Question

Je veux créer des vues utilisateur (tables) avec tri et capacités de filtrage. J'utilise EventList ( listes vitrés ) comme source pour EventTableModel. Il y a aussi la liste triée et certains éléments de filtrage dans GlazedLists, donc je peux les utiliser pour créer la vue. Mais je l'ai trouvé JXTable et il a des méthodes de tri et de filtrage, et ce que je veux que cela fonctionne: le tri et le filtrage doit fournir composant d'interface utilisateur et le modèle juste peut contenir des données:

EventList<Item> source=new BasicEventList<Item>();
TableModel model=new DefaultEventTableModel<Item>(source,tableFormat); // It'll be
//perfect if I could create model without tableFormat,
//because it's presentation of data,
//but in GlazedLists I can't :( ...
JTalbe ui=new JXTable(model); // UI with sorting and filtering

Mais GlazedLists fournissent également SortedList (décorateur pour EventList avec tri), et des méthodes de filtrage.

EventList<Item> source=new BasicEventList<Item>();
SortedList<Item> sortedSource=new SortedList<Item>(source,comparator);
TableModel model=new DefaultEventTableModel<Item>(sortedSource,tableFormat); 
// model with sorting... not very beautifull for me, but what do you think?

JTable ui=new JTable(model); // UI with sorting provided by model

Et la question est: quel modèle est le meilleur. Ou peut-être les deux sont faux, et que faire pour la création des points de vue?

Était-ce utile?

La solution

Je vote pour GlazedLists, parce que cela fonctionne. Oui, la TableModel que vous utilisez avec la table est étroitement couplée à la vue, mais vous découpler ce modèle de table à partir de vos données source.

caractéristiques de filtrage et de tri de GlazedLists sont beaucoup plus souple que celui sur JXTable. Assurez-vous que vous ne les avez pas deux sous tension, ou les choses vont se confondre. Voici mon extrait habituelle de code pour utiliser un SortedList avec un JXTable:

private <T> EventTableModel<T> setupTable(JXTable table, TableFormat<T> tf, EventList<T> displayItems, SortedList<T> sortedItems)
{
    table.setColumnControlVisible(true);
    table.setSortable(false);
    table.getTableHeader().setDefaultRenderer(new JTableHeader().getDefaultRenderer());
table.setAutoCreateRowSorter(false);
table.setRowSorter(null);

    EventTableModel<T> etm = new EventTableModel<T>(displayItems, tf);
    table.setModel(etm);

    TableComparatorChooser.install(table, sortedItems, AbstractTableComparatorChooser.SINGLE_COLUMN);
    return etm;
}

Qu'est-ce que cela fait:

  • allumer le gadget sélecteur de colonne sur la partie supérieure droite du JXTable
  • désactiver le tri JXTable de builtin
  • installer GlazedLists' tri fonctions à la place
  • Configuration de la table avec un EventTableModel dérivé du TableFormat

Notez que vous passez deux EventLists, un displayItems qui est la liste à la fin de la canalisation, et un SortedList utilisé pour contrôler la colonne utilisée pour le tri, qui peut être plus tôt dans la pipeline que la liste des displayItems. (Si votre dernier élément est le SortedList, sans aucun traitement après cela, il suffit de passer la liste deux fois.)

Autres conseils

Dans le cas où vous utilisez le everthing DefaultEventTableModel est ok. Comme le modèle des registres trieurs sur la source de EventList. Il est fait en interne comme dans votre liste 2. Dans le cas où vous enregistrez le trieurs manuellement, vous devez mettre en œuvre tout le code pour changer le comparateur (par exemple asc, desc). Lorsque vous essayez d'utiliser le filtrage de son même, mais le IMHO JXTable ne supporte pas un mécanisme pour cela, donc vous devez le faire à votre façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top