2016-05-27 2 views
0

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

В основном я последовал примеру в: [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] I упаковал список данных в список фильтров, прежде чем он будет передан 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, я только добавил сеттер-метод «Setlist (список 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], но, хотя он не работает.

ответ

0

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

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

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

+0

Теперь это работает, спасибо! –

+0

Другой вопрос (немного не по теме, но я надеюсь, что все в порядке): Есть ли возможность изменить registerConfigAttribute для фильтра (например, для регулярного выражения или combobox) во время выполнения? –

+0

TextMatchingMode определяется во время выполнения, поэтому это должно быть возможно. –

Смежные вопросы