繁体   English   中英

NatTable:表格对过滤没有反应

[英]NatTable: Table don't react on filtering

我尝试使用釉面列表实现一个简单的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之前,我将其打包到filterList中。 之后,我使用GlazedListsEventLayer构建了bodyLayerStack。

    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],尽管它没有用。

问题似乎是您通过setList()交换内容的方式。 在创建DefaultGlazedListsFilterStrategy时,筛选器逻辑将绑定到第一个列表。 现在,您可以通过setList()交换正文中的内容,但过滤器仍在旧列表上运行。

由于这些事实,在NatTable中交换数据的典型方法是清除原始列表并在其中添加新内容。 请注意,如果数据集很大,则应在进行此类更改之前禁用事件层,然后再启用它,以免发生有关更新和事件处理的竞争条件。

我不确定我们是否也支持在过滤策略中更改列表。 那可能是另一种选择。 但由于其他条件,我不确定是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM