NatTable: Table 不对过滤做出反应
NatTable: Table don't react on filtering
我尝试使用 glazedlists 实现一个简单的过滤器行。
过滤器行出现,我可以将过滤器字符串放入文本字段中。
在那之前一切正常,但按下回车键,什么也没有发生。没有过滤。
我还阅读了以下文章:[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());
使用的class 'LogListDataProvider'只是对ListDataProvider的扩展,我只添加了一个setter方法'setList(List list)'因为我刷新了table使用其内容创建后。
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 中交换数据的典型方式是清除原始列表中的内容并添加新内容。请注意,如果是大型数据集,您应该在此类更改之前禁用事件层,然后再次启用它以避免有关更新和事件处理的竞争条件。
我不确定我们是否也支持更改过滤策略中的列表。那可能是另一种选择。但我不确定这是否会因为其他条件而起作用。
我尝试使用 glazedlists 实现一个简单的过滤器行。 过滤器行出现,我可以将过滤器字符串放入文本字段中。 在那之前一切正常,但按下回车键,什么也没有发生。没有过滤。
我还阅读了以下文章:[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());
使用的class 'LogListDataProvider'只是对ListDataProvider的扩展,我只添加了一个setter方法'setList(List list)'因为我刷新了table使用其内容创建后。
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 中交换数据的典型方式是清除原始列表中的内容并添加新内容。请注意,如果是大型数据集,您应该在此类更改之前禁用事件层,然后再次启用它以避免有关更新和事件处理的竞争条件。
我不确定我们是否也支持更改过滤策略中的列表。那可能是另一种选择。但我不确定这是否会因为其他条件而起作用。