Зарегистрируйте commandHandler с помощью EventList в Nattable с фильтрами - PullRequest
0 голосов
/ 06 ноября 2018

Как предложение из вопроса Nattable add row command Я попытался зарегистрировать обработчик команды с 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 конфигурацию, отличную от указанной выше.

1 Ответ

0 голосов
/ 06 ноября 2018

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

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

...