Проблема
Применение фильтрации на JTree, чтобы избежать появления определенных узлов/листов в отображаемой версии JTree. В идеале я ищу решение, которое позволяет иметь динамический фильтр, но я уже был бы рад, если бы смог заставить статический фильтр работать.
Чтобы сделать это немного проще, допустим, что JTree поддерживает только рендеринг, а не редактирование. Перемещение, добавление, удаление узлов должно быть возможным.
Пример - это поле поиска над JTree, и при вводе JTree будет отображаться только поддерево с совпадением.
Несколько ограничений: он должен использоваться в проекте, который имеет доступ к JDK и SwingX. Я хотел бы избежать включения других сторонних библиотек.
Я уже думал о нескольких возможных решениях, но ни один из них не казался идеальным
Подходы
Фильтрация на основе моделей
- украсить
TreeModel, чтобы отфильтровать некоторые из значений. Быстрая и грязная версия проста в написании. Отфильтруйте узлы, а при каждом изменении фильтра или делегатаTreeModelдекоратор может запустить событие, которое изменило все дерево (treeStructureChangedс корнем node как node). Объедините это с слушателями, которые восстанавливают состояние выбора и состояние расширенияJTree, и вы получаете версию, которая работает более или менее, но события, происходящие изTreeModel, испорчены. Это более или менее подход, используемый в этом вопросе - украсьте
TreeModel, но попробуйте запустить правильные события. Мне еще не удалось найти рабочую версию этого. Кажется, требуется копия делегатаTreeModel, чтобы иметь возможность запускать событие с правильными дочерними индексами, когда узлы удаляются из модели делегата. Я думаю, что еще некоторое время я мог бы заставить это работать, но он просто чувствует себя не так (фильтрация похожа на то, что должен делать вид, а не на модель). - украсить любую структуру данных, используемую для создания начального
TreeModel. Однако это полностью невозможно использовать повторно и, возможно, так сложно записать декоратор дляTreeModel
Просмотр фильтрации на основе
Это похоже на путь. Фильтрация не должна влиять на модель, а только на представление.
-
Я просмотрел класс
RowFilter. Хотя javadoc, кажется, предлагает вам использовать его в комбинации сJTree:когда он связан с JTree, запись соответствует node.
Я не мог найти никакой связи между
RowFilter(илиRowSorter) и классомJTree. Стандартные реализацииRowFilterи обучающих программ Swing, по-видимому, предполагают, чтоRowFilterможно использовать непосредственно с помощьюJTable(см.JTable#setRowSorter). Подобных методов не существует наJTree - Я также посмотрел
JXTreejavadoc. Он имеетComponentAdapter, а javadocComponentAdapterуказывает, чтоRowFilterможет взаимодействовать с целевым компонентом, но я не могу см., как я делаю ссылку междуRowFilterиJTree - Я еще не посмотрел, как
JTableобрабатывает фильтрацию с помощьюRowFilters, и, возможно, то же самое можно сделать в модифицированной версииJTree.
Короче говоря: я не знаю, как лучше всего решить этот
Примечание: этот вопрос является возможным дубликатом этого вопроса, но этот вопрос по-прежнему остается без ответа, вопрос довольно короткий, и ответы кажутся неполными, поэтому я подумал опубликуйте новый вопрос. Если это не сделано (в FAQ не было четкого ответа на этот вопрос), я обновлю этот 3-летний вопрос


