Tengo un objeto de datos representado en un TreeModel
, y me gustaría mostrar solo una parte en mi JTree
- por el bien del argumento, por ejemplo, las hojas y sus padres. ¿Cómo puedo ocultar/filtrar los nodos innecesarios?Ocultación/filtrado de nodos en un JTree?
Respuesta
Mientras que todavía está mostrando un árbol, entonces TreeModel
que filtra su existente TreeModel
debería ser lo suficientemente simple.
¿Puede explicar esto más? –
¿Qué quieres saber? Encontrará que es más fácil encontrar ejemplos que hagan lo mismo con TableModel. Desea crear un TreeModel que delegue en su modelo actual, pero elimina los nodos que no desea que aparezcan.Sugiero, al menos para empezar, hacer que todo el evento se propague como structureChanged (aunque pensándolo bien, la expansión del árbol se colapsará). –
Parte del problema es que "quitar nodos que no quiero que aparezca" también quita a sus hijos, aunque es posible que desee mostrarlos. –
Aproveche el código que usa para construir su TreeNode (s) y reconstruya los TreeNode (s) solo incluyendo los elementos que desee. Establezca el nodo raíz en TreeModel con el nodo raíz filtrado.
Es factible, pero cuando configura otro modelo, JTree hace muchas cosas bajo el capó, especialmente si detecta un cambio estructural. No es muy bueno en términos de rendimiento, tanto para la velocidad como para la memoria. – gouessej
Mi eventual implementación:
- Tiene dos
TreeModel
s, la que subyace y la filtrada uno. - Cuando se produce un cambio en el
TreeModel
subyacente, reconstruya elTreeModel
filtrado desde cero. Clone cada nodo que debería estar visible y agréguelo a su primer antecesor visible en elTreeModel
filtrado (o en la raíz si no hay ninguno visible). Vea el código a continuación, si tiene curiosidad. Esto tiene el desafortunado efecto secundario de colapsar cada ruta que el usuario tenía abierto. Para evitar esto, agregué un
TreeModelListener
al filtradoTreeModel
. Cuando el modelo cambia, guardo las rutas expandidas enJTree
(usandogetExpandedDescendants()
), luego las vuelvo a expandir más tarde (usandoSwingUtilities.invokeLater()
).Tuve que anular
equals()
en la claseTreeNode
que estaba usando para que los nuevos nodos clonados fueran los mismos que los nodos clonados.
...
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);
}
}
}
Ha intentado JXTree? (desafortunadamente el sitio web está caído ahora, pero puede buscar en Google los espejos)
En realidad, el soporte de filtros en JXTree nunca se ha implementado a pesar de que fue planificado, solo veo un campo no usado protegido sobre el filtrado en su código fuente. – gouessej
Si está buscando una solución comercial, JideSoft tiene un modelo de árbol filtrable. Aparte de eso, SwingX tiene una API de filtro que funcionará en JXTable, JXTreeTable, JXTree y JXList.
¡Gracias! Probé con el Jide, pero no pude hacer que hiciera lo que quería. Buscaré en la API de SwingX cuando tenga la oportunidad. –
¿Qué estás tratando de hacer exactamente? Si proporciona detalles, es posible que pueda dar un código específico. Según lo que entiendo, se mostrarán las hojas filtradas de los criterios de búsqueda, junto con sus padres. Esto se muestra en su demostración webstart, en http://www.jidesoft.com/products/download.htm, 'Demostración para todos los productos JIDE'. En esto, mire la demostración QuickFilter (Tree). – Aakash
Según recuerdo, estaba teniendo problemas para obtener el modelo de árbol Jide para mostrar los hijos visibles de padres invisibles. –
Debe tener en cuenta GlazedLists. Es una biblioteca fantástica para hacer transformaciones de tablas complejas con poco esfuerzo. También se han expandido a los árboles también. Puede requerir una pequeña refacturación de su código existente para incorporarlo a la forma de trabajar de GlazedLists. Pero mira la demostración y los webcasts para ver qué tan poderoso es. (Es una de las bibliotecas de Swing esenciales en mi opinión, y es de código abierto.)
No veo nada en GlazedLists para árboles: https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375 Por favor, puede decirnos dónde encontró ¿Sus API de filtrado para árboles? – gouessej
@gouessej está dentro de la carpeta de extensiones: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo
Gracias pero trabaja en tablas de árboles, no en árboles. – gouessej
Tome un vistazo a esta aplicación: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
Se crea subclases de DefaultMutableNode añadiendo una propiedad "isVisible" en lugar de en realidad la eliminación/agregar nodos del TreeModel.
Hace poco necesitaba implementar el filtrado en un JTree y esta solución era, con mucho, la más limpia y simple. – Aaron
- 1. Nodos de arrastrar y colocar en JTree
- 2. ¿Cómo borro un modelo de JTree? (Eliminando todos los nodos)
- 3. JTree: Seleccionar todos los nodos de forma programática
- 4. Java JTree expande solo nodos de nivel uno
- 5. actualizando JTree en Java GUI
- 6. Obteniendo un nodo en JTree
- 7. Java: ¿Cómo seleccionar programáticamente y expandir múltiples nodos en un JTree?
- 8. almacenar estado/nodos expandidos de un jtree para restaurar el estado
- 9. JTree con casillas de verificación
- 10. Jtable como Jtree Node
- 11. ¿Cómo obtener la profundidad del nodo actual en JTree?
- 12. Expansión de la ruta JTree específica
- 13. ¿Cómo buscar un nodo particular en jtree y expandir ese nodo?
- 14. ¿Hay alguna manera de detectar si una gota está por ocurrir en un JTree?
- 15. JTree Line Style y Nimbus
- 16. Creando JTable dentro del nodo de JTree
- 17. Haga clic derecho en el menú contextual para Java JTree?
- 18. ¿Cómo obtener todos los elementos secundarios del nodo raíz en jtree?
- 19. JTree hacen sólo deja que pueden arrastrarse
- 20. Eliminación de nodos de un XmlDocument
- 21. Nombrando nodos en Erlang
- 22. biblioteca para transformar un árbol de nodos
- 23. ¿Cómo agregar casilla de verificación al nodo JTree para administrar la multiselección?
- 24. ¿Cómo implemento la función de arrastrar y soltar inteligente de un JTree a otro?
- 25. Fragmentación automática de un mapa de Java en varios nodos
- 26. Editor gráfico de nodos
- 27. querySelectorAll: manipulación de nodos
- 28. ¿La mejor manera de implementar tooltips para JTree?
- 29. nodos Extracción de XDocument
- 30. Actualizar nodos existentes en un diseño de fuerza d3
esto es un hilo desactualizado y menos informativo que este duplicado: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal