Как отсортировать TreeList с другим компаратором для каждого столбца в NatTable

Я использую NatTable для отображения дерева с несколькими столбцами. Дерево выравнивается в SortedList, который используется для создания TreeList.

EventList<Person> eventList = GlazedLists.eventList(perfStats.getFlattenedTree());
TransformedList<Person, Person> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
SortedList<Person> sortedList = new SortedList<(rowObjectsGlazedList, null);
TreeList treeList = new TreeList(sortedList, treeFormat, TreeList.nodesStartCollapsed());

Это работает для отображения дерева. Однако теперь моя проблема заключается в том, как правильно отсортировать это?

Желаемый результат будет состоять в том, чтобы корни были правильно отсортированы, затем дочерние элементы внутри должным образом отсортированы независимо и так далее.

Прямо сейчас я использую GlazedListsSortModel, и он сортирует сплющенное дерево, а затем строит отображение из того, что не работает.

Любая помощь или просто указание меня в правильном направлении будут оценены!


person Stephen Wicklund    schedule 03.06.2019    source источник


Ответы (1)


При использовании TreeList вы передаете Comparator для древовидной структуры через TreeList#Format. Это необходимо для обеспечения правильного создания дерева, поскольку оно является производным от List. Таким образом, даже если применяется сортировка через SortedList, в конце концов победит Comparator из TreeList#Format.

Поэтому для решения вашего требования вам необходимо реализовать TreeList#Format, который учитывает сортировку столбцов. Это можно сделать, например, используя NatTable SortableTreeComparator. Вы можете посмотреть наш TreeGridExample, чтобы понять, как это может выглядеть.

Более расширенную версию можно увидеть в GroupByComparator, который используется для поддержки сортировки по столбцу с помощью функции GroupBy.

person Dirk Fauth    schedule 04.06.2019
comment
Спасибо, кажется, я понял общую структуру. Однако я пытаюсь написать компаратор TreeList#Format, очень похожий на тот, что находится в TreeGridExample, и это не имеет смысла. Сравнение, похоже, вызывается только для элементов с одинаковой глубиной. Если я правильно понимаю, и это должно поддерживать структуру дерева, это не имеет смысла. Дерево отображается нормально, если компаратор TreeList#Format не используется, но сортировка работает неправильно. Извините, если я далеко, но дополнительная помощь будет оценена по достоинству. - person Stephen Wicklund; 04.06.2019
comment
Не знаю, как помочь больше. Я предоставил два примера, которые мы используем по умолчанию. Я знаю, что эта тема не является тривиальной, но без дополнительных подробностей о том, что вы изменили в своем примере, я не могу дать больше подсказок. - person Dirk Fauth; 04.06.2019
comment
Я считаю, что в TreeGridExample есть ошибка, которая вызвала у меня некоторую путаницу... В функции DatumTreeFormat getComparator она возвращает SortableTreeComparator, созданный с использованием теста компаратора, который нарушает структуру дерева. Если SortableTreeComparator построен с другим компаратором, который закомментирован, он работает правильно. - person Stephen Wicklund; 06.06.2019