Con un JTree, suponiendo que el nodo raíz es nivel 0 y puede haber hasta 5 niveles debajo de la raíz, ¿cómo puedo expandir fácilmente todos los nodos de nivel 1 para que todos los niveles 1 & 2 las ramas y las hojas son visibles pero los niveles 3 y siguientes no lo son?Java JTree expande solo nodos de nivel uno
Respuesta
Gracias por la respuesta rápida chicos. Sin embargo, ahora he encontrado la solución simple que estaba buscando. Por alguna razón, simplemente no pude ver DefaultMutableTreeNode.getLevel() en los JavaDocs. FYI lo que estoy haciendo ahora es:
DefaultMutableTreeNode currentNode = treeTop.getNextNode();
do {
if (currentNode.getLevel()==1)
myTree.expandPath(new TreePath(currentNode.getPath()));
currentNode = currentNode.getNextNode();
}
while (currentNode != null);
Utilice expand(TreePath) para todos los nodos de nivel 2.
usted tiene algunas clases de utilidad Árbol por ahí que hacen precisamente eso:
Como this one:
public class SimpleNavigatorTreeUtil {
/**
* Expands/Collapse specified tree to a certain level.
*
* @param tree jtree to expand to a certain level
* @param level the level of expansion
*/
public static void expandOrCollapsToLevel(JTree tree, TreePath treePath,int level,boolean expand) {
try {
expandOrCollapsePath(tree,treePath,level,0,expand);
}catch(Exception e) {
e.printStackTrace();
//do nothing
}
}
public static void expandOrCollapsePath (JTree tree,TreePath treePath,int level,int currentLevel,boolean expand) {
// System.err.println("Exp level "+currentLevel+", exp="+expand);
if (expand && level<=currentLevel && level>0) return;
TreeNode treeNode = (TreeNode) treePath.getLastPathComponent();
TreeModel treeModel=tree.getModel();
if (treeModel.getChildCount(treeNode) >= 0) {
for (int i = 0; i < treeModel.getChildCount(treeNode); i++ ) {
TreeNode n = (TreeNode)treeModel.getChild(treeNode, i);
TreePath path = treePath.pathByAddingChild(n);
expandOrCollapsePath(tree,path,level,currentLevel+1,expand);
}
if (!expand && currentLevel<level) return;
}
if (expand) {
tree.expandPath(treePath);
// System.err.println("Path expanded at level "+currentLevel+"-"+treePath);
} else {
tree.collapsePath(treePath);
// System.err.println("Path collapsed at level "+currentLevel+"-"+treePath);
}
}
}
Básicamente, es necesario explorar los subnodos hasta que sus criterios (en este caso el nivel de profundidad) se cumple y expande todos los nodos hasta ese punto.
Esto debería funcionar -
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.util.*;
public class Tree {
public static void main(String[] args) {
JPanel panel = new JPanel(new BorderLayout());
final JTree tree = new JTree();
panel.add(new JScrollPane(tree));
JButton btn = new JButton("Press Me");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
for (Enumeration e = ((TreeNode)tree.getModel().getRoot()).children();e.hasMoreElements();) {
TreeNode tn = (TreeNode)e.nextElement();
tree.expandPath(new TreePath(((DefaultTreeModel)tree.getModel()).getPathToRoot(tn)));
}
}
});
panel.add(btn, BorderLayout.SOUTH);
JFrame frame = new JFrame("");
frame.getContentPane().add(panel);
frame.setSize(300, 300);
frame.setLocation(100, 100);
frame.pack();
frame.show();
}
}
** ¡ADVERTENCIA! ** 'children()' te ofrece solo un nivel de niños. Necesitas 'breadthFirstEnumeration()'. Entonces funciona –
medida que su nivel 1 nodos son todos hijos del nodo raíz, y suponiendo que está utilizando DefaultMutableTreeNode
(necesario para la llamada a getPath()
), que sólo puede iterar sobre los hijos del nodo raíz de este modo:
Enumeration<?> topLevelNodes
= ((TreeNode)tree.getModel().getRoot()).children();
while(topLevelNodes.hasMoreElements()) {
DefaultMutableTreeNode node
= (DefaultMutableTreeNode)topLevelNodes.nextElement();
tree.expandPath(new TreePath(node.getPath()));
}
- 1. Ocultación/filtrado de nodos en un JTree?
- 2. Nodos de arrastrar y colocar en JTree
- 3. actualizando JTree en Java GUI
- 4. JTree: Seleccionar todos los nodos de forma programática
- 5. ¿Cómo borro un modelo de JTree? (Eliminando todos los nodos)
- 6. Java: ¿Cómo seleccionar programáticamente y expandir múltiples nodos en un JTree?
- 7. Cómo seleccionar varios nodos en uno para cada uno XSLT
- 8. iconos de nodo Cambio JTree de acuerdo con el nivel de profundidad
- 9. Haga clic derecho en el menú contextual para Java JTree?
- 10. almacenar estado/nodos expandidos de un jtree para restaurar el estado
- 11. Django y MPTT: obtenga solo nodos hoja
- 12. Jtable como Jtree Node
- 13. JTree con casillas de verificación
- 14. ¿Cómo obtener solo divs de primer nivel?
- 15. Expansión de la ruta JTree específica
- 16. Creando JTable dentro del nodo de JTree
- 17. Lista dinámica que se expande automáticamente
- 18. Carrierwave; cargadores múltiples o solo uno?
- 19. JTree Line Style y Nimbus
- 20. Obteniendo un nodo en JTree
- 21. Propiedad de solo lectura PropertyGrid en el nivel de objeto
- 22. ¿Cómo obtener la profundidad del nodo actual en JTree?
- 23. Expande automáticamente un factor R en una colección de variables de indicador 1/0 para cada nivel de factor
- 24. Propiedades de solo lectura de nivel de clase en Python
- 25. JAVA element.getElementsByTagName Restringir a nivel superior
- 26. Cómo expandir los hijos de primer nivel solo de Treeview
- 27. Xpath para seleccionar solo los nodos donde existen elementos secundarios?
- 28. ¿Por qué Mercurial solo tiene un nivel de reversión?
- 29. Nivel de registro por appender para un solo registrador
- 30. ¿Cómo `ls` solo tiene un nivel de profundidad?
Esa es una buena solución también: +1. Puede aceptar su propia solución si lo desea (y ponerla en la parte superior de las respuestas), pero sepa que no ganará ningún punto de repetición. – VonC
+1 Buena respuesta simple. –