在带有过滤器的Nattable中向事件列表注册commandHandler

时间:2018-11-06 14:09:15

标签: nattable

作为问题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配置中找不到。

1 个答案:

答案 0 :(得分:0)

关于列表实例似乎有很大的误解。如果要使用过滤器功能,则显示的BodyLayerStack是正确的。您必须在FilterList中使用IDataProvider。现在绝对有理由更改它!

对于命令处理程序,您需要使用基本的EventList实例。当然,如果您使用从IDataProvider获得的列表,那是行不通的。您需要以其他方式提供对EventList的访问权限。从您在本文章以及其他相关文章中显示的摘录中,我看不到您通过IDataProvider访问基础列表的原因,但是正如您已经注意到的那样,这是行不通的。您需要更改代码结构。