【问题标题】:NatTable: Table don't react on filteringNatTable:表格对过滤没有反应
【发布时间】:2016-09-25 15:53:08
【问题描述】:

我尝试用 glazedlists 实现一个简单的过滤器行。 过滤器行出现,我可以将过滤器字符串放入文本字​​段。 在那之前一切正常,但按下回车键,什么也没有发生。没有过滤。

我主要遵循以下示例:[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] 中所述,我将数据列表打包到 filterList 中,然后再将其传递给 DataProvider。之后,我使用 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],但尽管它不起作用。

【问题讨论】:

    标签: java filter glazedlists nebula nattable


    【解决方案1】:

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

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

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

    【讨论】:

    • 另一个问题(有点跑题,但我希望没问题):是否有可能在运行时更改过滤器的 registerConfigAttribute(例如,用于正则表达式匹配或组合框)?
    • TextMatchingMode 是在运行时确定的,因此应该可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2017-07-18
    • 2020-01-18
    相关资源
    最近更新 更多