Фильтрация по JTree [закрыто]

Проблема

Применение фильтрации к JTree , чтобы избежать появления определенных узлов / листьев в визуализированном версия JTree . В идеале я ищу решение, позволяющее использовать динамический фильтр, но я уже был бы рад, если бы смог заставить работать статический фильтр.

Чтобы упростить задачу, предположим, что JTree поддерживает только рендеринг, но не редактирование. Должны быть возможны перемещение, добавление, удаление узлов.

Примером является поле поиска над JTree , и при вводе JTree будет отображаться только поддерево с совпадениями.

Несколько ограничений: его следует использовать в проекте, имеющем доступ к JDK и SwingX. Я бы не хотел включать другие сторонние библиотеки.

Я уже придумал несколько возможных решений, но ни один из них не казался идеальным

Подходы

Фильтрация на основе моделей

  • украшает TreeModel , чтобы отфильтровать некоторые значения. Быструю версию написать легко. Отфильтруйте узлы, и при каждом изменении фильтра или делегата TreeModel декоратор может инициировать событие, что все дерево имеет изменения ( treeStructureChanged с корневым узлом в качестве узла).Объедините это со слушателями, которые восстанавливают состояние выбора и состояние расширения JTree , и вы получите версию, которая работает более или менее, но события, происходящие из TreeModel , испорчены. Это более или менее подход, использованный в , этот вопрос
  • украшает TreeModel , но пытается запустить правильные события. Мне (пока) не удалось придумать рабочую версию этого. Кажется, требуется копия делегата TreeModel , чтобы иметь возможность запускать событие с правильными дочерними индексами при удалении узлов из модели делегата. Думаю, по прошествии некоторого времени я смогу заставить это работать, но это кажется неправильным (фильтрация кажется чем-то, что должно делать представление, а не модель)
  • украсить любую структуру данных, которая использовалась для создания начальной TreeModel . Тем не менее, его нельзя использовать повторно, и, вероятно, так же сложно, как написать декоратор для TreeModel

фильтрации на основе представлений

Это похоже на правильный путь. Фильтрация не должна влиять на модель, а только на вид.

  • Я взглянул на класс RowFilter . Хотя javadoc, кажется, предлагает вам использовать его в сочетании с JTree :

    , когда он связан с JTree, запись соответствует узлу.

    Мне не удалось найти никакой связи между RowFilter (или RowSorter ) и классом JTree .Стандартные реализации RowFilter и руководства по Swing, кажется, предполагают, что RowFilter может использоваться напрямую только с JTable (см. JTable # setRowSorter ]). Подобные методы недоступны для JTree

  • . Я также просмотрел JXTree javadoc. Он имеет доступный ComponentAdapter , а javadoc ComponentAdapter указывает, что RowFilter может взаимодействовать с целевым компонентом, но я не понимаю, как я устанавливаю связь между RowFilter и JTree
  • Я еще не изучал, как JTable обрабатывает фильтрацию с помощью RowFilter , и, возможно, то же самое может быть сделано на модифицированной версии JTree .

Вкратце: я понятия не имею, как лучше всего решить эту

Примечание: этот вопрос является возможным дубликатом этого вопроса , но этот вопрос все еще остается без ответа, вопрос скорее короче, и ответы кажутся неполными, поэтому я решил задать новый вопрос. Если этого не сделать (FAQ не дал четкого ответа на этот вопрос), я обновлю этот вопрос трехлетней давности

34
задан Community 23 May 2017 в 12:34
поделиться