Проблема
Применение фильтрации на 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
- Я также посмотрел
JXTree
javadoc. Он имеетComponentAdapter
, а javadocComponentAdapter
указывает, чтоRowFilter
может взаимодействовать с целевым компонентом, но я не могу см., как я делаю ссылку междуRowFilter
иJTree
- Я еще не посмотрел, как
JTable
обрабатывает фильтрацию с помощьюRowFilter
s, и, возможно, то же самое можно сделать в модифицированной версииJTree
.
Короче говоря: я не знаю, как лучше всего решить этот
Примечание: этот вопрос является возможным дубликатом этого вопроса, но этот вопрос по-прежнему остается без ответа, вопрос довольно короткий, и ответы кажутся неполными, поэтому я подумал опубликуйте новый вопрос. Если это не сделано (в FAQ не было четкого ответа на этот вопрос), я обновлю этот 3-летний вопрос