作为问题Nattable add row command的建议,我尝试向EventList
注册命令处理程序。
但是,由于Eventlist
被充当FilterList
的{{1}}包裹着,所以我无法基于BodyDataProvider
创建一个DataLayer
来注册我的EventList
。
起点是定义以下内容的CommmandHandler
的上一个问题:
BodyLayerStack
我尝试了以下方法:
class BodyLayerStack extends AbstractLayerTransform {
//AncolabMaterial is the model to show at the natTable
private final EventList<AncolabMaterial> filterList;
private final IDataProvider bodyDataProvider;
private final SelectionLayer selectionLayer;
public BodyLayerStack(List<AncolabMaterial> input_values_list, IColumnPropertyAccessor<AncolabMaterial> columnPropertyAccessor) {
EventList<AncolabMaterial> eventList = GlazedLists.eventList(input_values_list);
TransformedList<?, ?> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
SortedList<?> sortedList = new SortedList<>(rowObjectsGlazedList, null);
this.filterList = new FilterList<AncolabMaterial>((EventList<AncolabMaterial>) sortedList);
this.bodyDataProvider = new ListDataProvider<AncolabMaterial>(filterList, columnPropertyAccessor);
DataLayer bodyDataLayer = new DataLayer(getBodyDataProvider());
//Other layers stacked
GlazedListsEventLayer<?> glazedListsEventLayer = new GlazedListsEventLayer<AncolabMaterial>(bodyDataLayer, this.filterList);
this.selectionLayer = new SelectionLayer(glazedListsEventLayer, false);
//...
}
}
但是由于DataLayer dataLayer = new DataLayer(
new ListDataProvider<AncolabMaterial>(eventList, columnPropertyAccessor));
包装了DataLayer
,并且充当了所有其他层的数据源,所以如果我将IDataProvider
设置为{{1 }},然后EvenList
无法正常工作。
即IDataProvider
不是DataLayer
的底。
我在nattable_examples->教学示例-> GlazedLists->过滤与上述不同的其他filterlList
配置中找不到。
答案 0 :(得分:0)
关于列表实例似乎有很大的误解。如果要使用过滤器功能,则显示的BodyLayerStack
是正确的。您必须在FilterList
中使用IDataProvider
。现在绝对有理由更改它!
对于命令处理程序,您需要使用基本的EventList
实例。当然,如果您使用从IDataProvider
获得的列表,那是行不通的。您需要以其他方式提供对EventList
的访问权限。从您在本文章以及其他相关文章中显示的摘录中,我看不到您通过IDataProvider
访问基础列表的原因,但是正如您已经注意到的那样,这是行不通的。您需要更改代码结构。