2009-05-06 23 views
10

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?

+0

esto es un hilo desactualizado y menos informativo que este duplicado: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal

Respuesta

0

Mientras que todavía está mostrando un árbol, entonces TreeModel que filtra su existente TreeModel debería ser lo suficientemente simple.

+0

¿Puede explicar esto más? –

+0

¿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á). –

+1

Parte del problema es que "quitar nodos que no quiero que aparezca" también quita a sus hijos, aunque es posible que desee mostrarlos. –

0

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.

+0

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

8

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 el TreeModel filtrado desde cero. Clone cada nodo que debería estar visible y agréguelo a su primer antecesor visible en el TreeModel 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 filtrado TreeModel. Cuando el modelo cambia, guardo las rutas expandidas en JTree (usando getExpandedDescendants()), luego las vuelvo a expandir más tarde (usando SwingUtilities.invokeLater()).

    Tuve que anular equals() en la clase TreeNode 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); 
     } 
    } 
    } 
2

Ha intentado JXTree? (desafortunadamente el sitio web está caído ahora, pero puede buscar en Google los espejos)

+0

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

1

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.

+0

¡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. –

+0

¿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

+0

Según recuerdo, estaba teniendo problemas para obtener el modelo de árbol Jide para mostrar los hijos visibles de padres invisibles. –

3

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.)

+0

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

+0

@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

+1

Gracias pero trabaja en tablas de árboles, no en árboles. – gouessej

Cuestiones relacionadas