2016-05-27 3 views
0

J'essaie de mettre en œuvre un filtre simple avec des listes vernies. Le filtre apparaît et je peux mettre ma chaîne de filtre dans les champs de texte. Jusque là tout fonctionne bien mais en appuyant sur Entrée, rien ne se passe. Pas de filtrage.NatTable: La table ne réagit pas au filtrage

La plupart du temps j'ai suivi l'exemple: [1] https://github.com/eclipse/nebula.widgets.nattable/blob/master/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6031_GlazedListsFilterExample.java

Je lis aussi l'article suivant: [2] http://www.eclipse.org/nattable/resources/NatTable_Advanced.pdf

maintenant à ma mise en œuvre:

Comme décrit dans [1] I emballé la liste de données dans un filterList avant qu'il soit passé à DataProvider. Après cela, j'ai construit mon bodyLayerStack avec le GlazedListsEventLayer.

EventList<T> eventList = GlazedLists.eventList(entries); 
    TransformedList<T, T> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList); 
    SortedList<T> sortedList = new SortedList<T>(rowObjectsGlazedList, null); 

    filterList = new FilterList<T>(sortedList); 

    bodyDataProvider = new LogListDataProvider<>(filterList, columnPropertyAccessor); 
    DataLayer bodyDataLayer = new DataLayer(getBodyDataProvider()); 
    GlazedListsEventLayer<T> glazedListsEventLayer = new GlazedListsEventLayer<T>(bodyDataLayer, filterList); 
    ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(glazedListsEventLayer); 
    ColumnHideShowLayer columnHideShowLayer = new ColumnHideShowLayer(columnReorderLayer); 
    selectionLayer = new SelectionLayer(columnHideShowLayer, false); 

    ViewportLayer viewportLayer = new ViewportLayer(getSelectionLayer()); 

La classe utilisée « LogListDataProvider » est juste une extension du ListDataProvider, je n'ajouté une méthode setter « Confirmed (liste de la liste) » parce que je rafraîchir la table après avoir créé avec son contenu.

public class LogListDataProvider<T> extends ListDataProvider<T> { 

public LogListDataProvider(List<T> list, IColumnAccessor<T> columnAccessor) { 
    super(list, columnAccessor); 
} 

public void setList(List<T> list) { 
    this.list = list; 
} 

}

Pour le FilterRowHeader j'ai suivi exemple [1] et de construire un FilterRowHeaderComposite. Pour moi, il semble que j'ai suivi correctement [1] et [2], mais cela ne fonctionne pas.

Répondre

0

Le problème semble être votre façon d'échanger le contenu via setList(). La logique de filtrage est liée à la première liste lors de la création de DefaultGlazedListsFilterStrategy. Maintenant vous échangez le contenu dans le corps via setList() mais le filtre fonctionne toujours sur l'ancienne liste. En raison de ces faits, la manière typique d'échanger des données dans un NatTable est d'effacer et d'ajouter du nouveau contenu sur la liste originale. Notez que dans le cas de grands ensembles de données, vous devez désactiver la couche d'événements avant un tel changement et l'activer ensuite pour éviter les conditions de concurrence en ce qui concerne les mises à jour et le traitement des événements.

Je ne suis pas sûr si nous prenons également en charge le changement de la liste dans la stratégie de filtrage. Cela pourrait être une autre option. Mais je ne suis pas sûr que cela fonctionnerait à cause d'autres conditions.

+0

Maintenant ça marche, merci! –

+0

Une autre question (un peu hors-sujet, mais j'espère que c'est bon): Y at-il une possibilité de changer le registerConfigAttribute pour le filtre (par exemple pour la correspondance d'expression régulière ou combobox) sur l'exécution? –

+0

Le TextMatchingMode est déterminé lors de l'exécution, il devrait donc être possible. –