Я пытаюсь реализовать простой фильтр с глазурованными листами. Фильтр появляется, и я могу поместить строку фильтра в текстовые поля. До тех пор все работает нормально, но при нажатии 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], но, хотя он не работает.
Теперь это работает, спасибо! –
Другой вопрос (немного не по теме, но я надеюсь, что все в порядке): Есть ли возможность изменить registerConfigAttribute для фильтра (например, для регулярного выражения или combobox) во время выполнения? –
TextMatchingMode определяется во время выполнения, поэтому это должно быть возможно. –