TreeDataGrid принудительный expander

Добрый день!
Пытаемся прикрутить lazy load на раскрытие узлов иерархии. Чтобы при изначальном открытии подгружались только корневые узлы, а потомки догружались уже при открытии. Но если загрузить только корневые, а их потомков не грузить, то экспандер просто не появляется и событие ExpandEvent не получается инициировать. Есть ли какой-то способ сделать узел принудительно раскрываемым? Или как-то иначе решить проблему загрузки большой иерархии

Попробуйте метод TreeDataGrid#expandRecursively(Collection, int).
В нем второй параметр отвечает за глубину раскрытия.

Добрый день.

У нас есть небольшой пример, как можно загружать данные частями, по мере того как они будут требоваться компоненту TreeDataGrid. Проект можно найти на GitHub.

Что входит в состав проекта:

  • Task- тестовая иерархическая сущность.
  • LazyTreeDataGrid - расширение компонента TreeDataGrid, необходимое, чтобы создавать специальную реализацию DataProvider для внутреннего Vaadin компонента.
  • LazyHierarchicalDataGridDataProvider - является связующим звеном между Vaadin API и Jmix API и делегирует загрузку данных переданному объекту LazyTreeDataGridItems.
  • LazyTreeDataGridItems - интерфейс, реализацию которого необходимо передавать в метод setItems компонента TreeDataGrid. Именно он выполняет работу по загрузке данных.

Регистрация LazyTreeDataGrid происходит в LazyTreeComponentApplication путем создания бина ComponentRegistration.

В контроллере экрана TaskBrowse создана примерная реализация LazyTreeDataGridItems - TaskLazyTreeDataGridItems. Данные загружаются с помощью DataManager, каждый раз, как они запрашиваются компонентом TreeDataGrid. Главным методом является fetchChildren. Ниже его реализация:

@Override
public Stream<Task> fetchChildren(HierarchicalQuery<Task, SerializablePredicate<Task>> query) {
    List<Task> list = dataManager.load(Task.class)
            .query("select e from demo_Task e where e.parent = :parent")
            .parameter("parent", query.getParent())
            .sort(sort)
            .firstResult(query.getOffset())
            .maxResults(query.getLimit())
            .list();

    log.info("Loaded: {} items", list.size());

    return list.stream();
}

Данная реализация является лишь примером и требует доработки и оптимизации. Например кэширование, т.к. Vaadin при определенных условиях вызывает fetchChildren по 2 раза для тех же параметров.

С уважением,
Глеб