Зарегистрируйте commandHandler с EventList в Nattable с фильтрами

Как предложение из вопроса команда Nattable добавить строку, я попытался зарегистрировать обработчик команд с помощью EventList.

Но поскольку Eventlist обернут FilterList, который действует как 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 и служит источником данных для всех остальных слоев, если я установлю EvenList как IDataProvider из DataLayer, то filterlList не будет работать должным образом. то есть this.filterList не является основанием bodyDataProvider.

Я не нашел в nattable_examples -> примеры учебных пособий -> GlazedLists -> Фильтр любой другой конфигурации BodyLayerStack, отличной от приведенной выше.


person J Robes    schedule 06.11.2018    source источник


Ответы (1)


Кажется, существует большое недоразумение в отношении экземпляров списка. Если вы хотите использовать функцию фильтра, показанный BodyLayerStack правильный. Вы должны использовать FilterList в IDataProvider. Теперь есть абсолютно все основания изменить это!

Для обработчика команд вам нужно использовать базовый экземпляр EventList. Конечно, это не сработает, если вы используете список, полученный от IDataProvider. Вам нужно предоставить доступ к EventList другим способом. Из фрагментов, которые вы показываете в этом и в другом связанном посте, я не вижу причины, по которой вы получаете доступ к базовому списку через IDataProvider, но, как вы уже заметили, это не работает. Вам нужно изменить структуру кода.

person Dirk Fauth    schedule 06.11.2018
comment
У меня похожая проблема. Я использую только сортировку и фильтрацию. Но я не понимаю, почему фильтрация работает, и пока я пытаюсь отсортировать, я получаю NullPointerException и RuntimeException. PropertyDescriptor равно нулю в ReflectiveColumnPropertyAccessor.class - person Michal Kotus; 26.01.2021
comment
Проблема может быть только в вашей настройке. Дважды проверьте список и создание слоя и сравните их с примерами. - person Dirk Fauth; 26.01.2021