FilteringTreeItem
Универсальный TreeItem с фильтрацией и сортировкой без сторонних библиотек.
Идеи:
Полный список детей хранится в internalChildren (источник истины).
Видимые дети (children) — отфильтрованное/отсортированное зеркало internalChildren.
Предикат predicate может наследоваться от родителя (inheritPredicate); суммарный — effectivePredicate.
Если includeParentsOfMatches = true, родитель остаётся видимым при совпадениях среди потомков.
При отсутствии предиката поведение задаёт includeWhenNoPredicate.
Сортировка применяется только к видимым детям через comparator.
Все изменения UI‑модели происходят на FX‑потоке; множественные запросы батчатся.
Рекомендации:
По возможности используйте FilteringTreeItem для всех узлов дерева, иначе «обычные» дети фильтруются только на своём уровне (их поддеревом эта реализация не управляет).
Не модифицируйте children напрямую — меняйте internalChildren или используйте addAll/setAll.
Properties
Автоматически разворачивать узел, если среди потомков есть совпадения.
Компаратор видимых детей. Применяется только к «витрине», internalChildren не трогается.
Держать родителей видимыми, если у них есть совпадающие потомки.
Что показывать без предиката: всё (true) или ничего (false).
Наследовать ли предикат от родителя. По умолчанию — да.
Полный список детей (не зависит от фильтра).
Локальный предикат (null = «локального условия нет»).
Functions
Ищет первый узел в дереве, у которого value.id == id. Возвращает TreeItem
Запросить пересчёт на FX‑потоке (батчинг).
Массово применить предикат к текущему узлу и потомкам‑FilteringTreeItem.
Структурная сортировка: переставляет internalChildren по компаратору.
Удобная структурная сортировка по значению (value) с селектором ключа.