У меня есть объект данных, представленный в TreeModel
, и я хотел бы показать только его часть в моем JTree
- ради аргумента, скажем, листья и их родители. Как я могу скрыть/отфильтровать ненужные узлы?Скрытие/фильтрация узлов в JTree?
ответ
Если вы все еще являетесь деревом, которое вы показываете, то TreeModel
, который фильтрует существующие вами TreeModel
, должен быть достаточно простым.
Можете ли вы объяснить это дальше? –
Что вы хотите знать. Вам будет легче найти примеры, которые делают то же самое с TableModel. Вы хотите создать TreeModel, который делегирует вашу текущую модель, но удаляет узлы, которые вы не хотите отображать.Я предлагаю, по крайней мере, начать с того, что вы делаете все событие распространенным как structChanged (хотя подумайте об этом, что приведет к срыву расширения дерева). –
Часть проблемы заключается в том, что «удаление узлов, которые я не хочу появляться» также удаляет их детей, хотя я могу их показать. –
Используйте код, используемый для создания TreeNode (ов), и перестройте TreeNode (ы), только включая нужные элементы. Установите корневой узел в TreeModel с фильтрованным корневым узлом.
Это выполнимо, но когда вы устанавливаете другую модель, JTree делает много вещей под капотом, особенно если обнаруживает структурные изменения. Это не очень хорошо с точки зрения производительности, как для скорости, так и для памяти. – gouessej
Моя возможная реализация:
- Есть два
TreeModel
с, лежащий в основе один и отфильтрованный один. - Когда происходит изменение в базовом
TreeModel
, перестройте отфильтрованныйTreeModel
с нуля. Клонировать каждый узел, который должен быть видимым, и добавить его к его первому видимому предшественнику в отфильтрованномTreeModel
(или корень, если ни один из них не виден). См. Ниже код, если вам интересно. У этого есть несчастливый побочный эффект, разрушающий каждый путь, который открыл пользователь. Чтобы обойти это, я добавил
TreeModelListener
фильтруемомуTreeModel
. Когда модель изменяется, я сохраняю расширенные пути вJTree
(используяgetExpandedDescendants()
), а затем повторно расширяет их позже (используяSwingUtilities.invokeLater()
).Мне пришлось переопределить
equals()
в классеTreeNode
, который я использовал, чтобы новые клонированные узлы были такими же, как старые клонированные узлы.
...
populateFilteredNode(unfilteredRoot, filteredRoot);
...
void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
{
for (int i = 0; i < unfilteredNode.getChildCount(); i++)
{
TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);
if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
{
populateFilteredNode(unfilteredChildNode, filteredNode);
}
else
{
TreeNode filteredChildNode = unfilteredChildNode.clone();
filteredNode.add(filteredChildNode);
populateFilteredNode(unfilteredChildNode, filteredChildNode);
}
}
}
Если вы ищете коммерческое решение, JideSoft имеет фильтруемую тремодель. Помимо этого, SwingX имеет API фильтра, который будет работать на JXTable, JXTreeTable, JXTree и JXList.
Спасибо! Я попробовал Jide, но я не мог заставить его делать то, что я хотел. Когда я получаю шанс, я посмотрю на SwingX API. –
Что именно вы пытаетесь сделать? Если вы предоставите подробные сведения, я могу дать конкретный код. Насколько я понимаю, отфильтрованные листья из критериев поиска будут показаны вместе со своими родителями. Это показано в их демонстрации в Интернете, по адресу http://www.jidesoft.com/products/download.htm, «Демо для всех продуктов JIDE». В этом случае посмотрите демонстрацию QuickFilter (Дерево). – Aakash
Насколько я помню, у меня возникли проблемы с тем, чтобы модель Jide tree продемонстрировала видимые дети невидимых родителей. –
Вы должны знать о GlazedLists. Это фантастическая библиотека для выполнения сложных табличных преобразований без особых усилий. Они также расширились и до деревьев. Это может потребовать небольшого рефакторинга вашего существующего кода, чтобы заставить его работать в режиме GlazedLists. Но ознакомьтесь с демо и веб-трансляциями, чтобы узнать, насколько он силен. (Это одна из основных библиотек Swing, на мой взгляд, и это с открытым исходным кодом.)
Я ничего не вижу в GlazedLists для деревьев: https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375 Пожалуйста, расскажите, где вы нашли его фильтрующие API для деревьев? – gouessej
@gouessej находится в папке с расширениями: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo
Спасибо, но это работает на таблицах деревьев, а не на деревьях. – gouessej
Взгляните на этой реализации: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
Это создает подклассы DefaultMutableNode добавлении «IsVisible» собственность, а затем на самом деле удаление/добавление узлов из TreeModel.
Мне недавно нужно было внедрить фильтрацию в JTree, и это решение было на сегодняшний день самым чистым и простым. – Aaron
- 1. Упорядочение узлов в A JTree
- 2. JTree - проблемы с добавлением узлов
- 3. Сортировка узлов JTree по алфавиту
- 4. Обход всех узлов многоуровневого JTree
- 5. Динамическое изменение значка определенных узлов в JTree
- 6. Обновление цвета фона узлов узлов JTree во время выполнения
- 7. Получение правильной позиции строки узлов JTree
- 8. Пустые строки после нелистных узлов JTree
- 9. Поддержка узлов JTree с одинаковыми детьми
- 10. Группы узлов JTree с использованием HashMap
- 11. Реализация узлов JTree с радио/флажками
- 12. Перетаскивание узлов из Jtree в операционную систему в swing
- 13. Как обновить JTree после добавления некоторых узлов в базовую модель?
- 14. Динамического создания узлов в JTree из запроса SQL
- 15. Изменение цвета одного или нескольких узлов в Jtree динамически
- 16. Java: Как программно выбирать и расширять несколько узлов в JTree?
- 17. Рендеринг узлов в JTree с несколькими разными шрифтами
- 18. значков узлов Изменения JTree в соответствии с уровнем глубины
- 19. Сравнение путей редактирования узлов в JTree всегда верно
- 20. Как вызвать DefaultTreeCellRenderer для определенных узлов в JTree
- 21. Фильтр jtree - сохранение всех узлов и дочерних узлов узлов, соответствующих критериям
- 22. JTree - Переместить узлы вправо
- 23. JTree, влияющий на JLabel
- 24. Ярлыки узлов JTree часто меняются, но ширина кэшируется
- 25. , изменяя, как Nimbus LaF обрабатывает выделение узлов JTree
- 26. JTree: Как добавить атрибуты узлов как их собственные листья?
- 27. Как настроить пользовательские значки для отдельных узлов на JTree?
- 28. Поиск JTree
- 29. Замените значки дескриптора JTree
- 30. Цветные ряды в JTree
Это устаревшая и менее информативная тема, чем этот дубликат: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal