NatTable: таблица не реагирует на фильтрацию

Я пытаюсь реализовать простой filterrow с glazedlists.
Появляется filterrow, и я могу поместить свою строку фильтра в текстовые поля.
До тех пор все работает нормально, но при нажатии enter ничего не происходит. Нет фильтрации.

В основном я следовал примеру в: [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

Я также прочитал следующую статью: [2] http://www.eclipse.org/nattable/resources/NatTable_Advanced.pdf

Теперь к моей реализации:

Как описано в [1], я упаковал список данных в список фильтров перед его передачей в DataProvider. После этого я построил свой bodyLayerStack с 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());

Используемый класс ‘ LogListDataProvider ‘является просто расширением ListDataProvider, я только добавил setter-метод’ setList(List list)’, потому что я обновляю таблицу после создания с ее содержимым.

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

}

Для FilterRowHeader я также следовал примеру [1] и построил FilterRowHeaderComposite.

FilterRowHeaderComposite<LogEntry> filterRowHeaderComposite = new FilterRowHeaderComposite<LogEntry>(
            new DefaultGlazedListsFilterStrategy<LogEntry>(bodyLayerStack.getFilterList(),
                    columnPropertyAccessor, configRegistry),
                    columnHeaderLayer, columnHeaderDataLayer.getDataProvider(), configRegistry);

    // Columns: 1 ; Rows: 2
    CompositeLayer compositeLayer = new CompositeLayer(1, 2);
    compositeLayer.addConfiguration(new DefaultGridLayerConfiguration(compositeLayer));

    // add headerlayer-stack and bodylayer-stack to compositelayer
    compositeLayer.setChildLayer(GridRegion.COLUMN_HEADER, filterRowHeaderComposite, 0, 0);
    compositeLayer.setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1);

Мне кажется, что я следовал [1] и [2] правильно, но хотя это не работает.

1 ответ

  1. Проблема, кажется, ваш способ обмена содержимым через setList (). Логика фильтра привязана к первому списку при создании DefaultGlazedListsFilterStrategy. Теперь вы обмениваетесь содержимым в теле через setList (), но фильтр все еще работает на старом списке.

    Из-за этих фактов типичным способом обмена данными в NatTable является очистка и добавление нового содержимого в исходный список. Обратите внимание, что в случае больших наборов данных вы должны отключить слой событий перед таким изменением и включить его после этого снова, чтобы избежать условий гонки относительно обновлений и обработки событий.

    Я не уверен, что мы также поддерживаем изменение списка в стратегии фильтра. Это может быть другой вариант. Но я не уверен, что это сработает из-за других условий.