sirve simple seleccionar que para nodo metodos example ejemplos defaultmutabletreenode java swing tree jtree

java - simple - ¿Cómo puedo expandir automáticamente un JTree cuando establezco un nuevo TreeModel?



seleccionar un nodo en jtree java (6)

Tengo un JTree personalizado y un JModel personalizado; Me gustaría que el JTree se "expanda automáticamente" cuando le doy un nuevo modelo. Por el momento, simplemente contrae todos los nodos a la raíz.

Aquí hay un ejemplo:

private class CustomTree extends JTree { @Override public boolean isExpanded(TreePath path) { return ((Person) path.getLastPathComponent).hasChildren(); } private class CustomTreeModel extends TreeModel { // ... omitting various implementation details @Override public boolean isLeaf(Object object) { return !((Person) object).hasChildren(); } } Model model = new Model(); Person bob = new Person(); Person alice = new Person(); bob.addChild(alice); model.setRoot(bob); JTree tree = new CustomTree(new CustomTreeModel(model));

En este punto, el árbol muestra correctamente:

- BOB - ALICE

donde Alice es hija de Bob (tanto en los datos como en el árbol visual)

Sin embargo, si llamo:

tree.setModel(new CustomTreeModel(model));

todo está colapsado:

+ BOB

¿Hay alguna manera de "expandir automáticamente" todo en el árbol al configurar un nuevo modelo?


Lo siguiente funcionó para mí (llamado después de configurar el nuevo modelo):

for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); }


Ya que no puedo editar ni comentar la respuesta aceptada para responder la última pregunta del OP:

¿Hay alguna manera de "expandir automáticamente" todo en el árbol al configurar un nuevo modelo?

Para expandir el árbol después de que se haya asignado un nuevo modelo (según lo solicitado por el OP), anule treeDidChange() en su árbol personalizado:

@Override public void treeDidChange() { super.treeDidChange(); expandAllNodes(this, 0, getRowCount()); }


También hay esta versión no recursiva.

private void expandAllNodes(JTree tree) { int j = tree.getRowCount(); int i = 0; while(i < j) { tree.expandRow(i); i += 1; j = tree.getRowCount(); } }



esto funcionó para mí ...

import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeNode; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Enumeration; public class JTreeNodeAutoExpandCollapse extends JFrame { public JTreeNodeAutoExpandCollapse() throws HeadlessException { initializeUI(); } private void initializeUI() { setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); DefaultMutableTreeNode chapter1 = new DefaultMutableTreeNode("Chapter 1"); DefaultMutableTreeNode sub1 = new DefaultMutableTreeNode("1.1"); DefaultMutableTreeNode sub2 = new DefaultMutableTreeNode("1.2"); DefaultMutableTreeNode sub3 = new DefaultMutableTreeNode("1.3"); DefaultMutableTreeNode sub31 = new DefaultMutableTreeNode("1.3.1"); DefaultMutableTreeNode sub32 = new DefaultMutableTreeNode("1.3.2"); root.add(chapter1); chapter1.add(sub1); chapter1.add(sub2); chapter1.add(sub3); sub3.add(sub31); sub3.add(sub32); final JTree tree = new JTree(root); expandTree(tree, false); JScrollPane pane = new JScrollPane(tree); pane.setPreferredSize(new Dimension(200, 200)); JPanel buttonPanel = new JPanel(new BorderLayout()); JButton expandAll = new JButton("Expand All"); expandAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { expandTree(tree, true); } }); JButton collapseAll = new JButton("Collapse All"); collapseAll.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { expandTree(tree, false); } }); buttonPanel.add(expandAll, BorderLayout.WEST); buttonPanel.add(collapseAll, BorderLayout.EAST); getContentPane().setLayout(new BorderLayout()); getContentPane().add(pane, BorderLayout.CENTER); getContentPane().add(buttonPanel, BorderLayout.SOUTH); } private void expandTree(JTree tree, boolean expand) { TreeNode root = (TreeNode) tree.getModel().getRoot(); expandAll(tree, new TreePath(root), expand); } private void expandAll(JTree tree, TreePath path, boolean expand) { TreeNode node = (TreeNode) path.getLastPathComponent(); if (node.getChildCount() >= 0) { Enumeration enumeration = node.children(); while (enumeration.hasMoreElements()) { TreeNode n = (TreeNode) enumeration.nextElement(); TreePath p = path.pathByAddingChild(n); expandAll(tree, p, expand); } } if (expand) { tree.expandPath(path); } else { tree.collapsePath(path); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new JTreeNodeAutoExpandCollapse().setVisible(true); } }); } }


Tuve un problema similar.

Su solución (tal como se publicó en https://.com/a/15211697/837530 ) pareció funcionar solo para los nodos de árbol de nivel superior.

Pero necesitaba expandir todo el nodo de un descendiente. Así que lo resolví con el siguiente método recursivo:

private void expandAllNodes(JTree tree, int startingIndex, int rowCount){ for(int i=startingIndex;i<rowCount;++i){ tree.expandRow(i); } if(tree.getRowCount()!=rowCount){ expandAllNodes(tree, rowCount, tree.getRowCount()); } }

que se invoca con

expandAllNodes(tree, 0, tree.getRowCount());

donde, el tree es un JTree .

A menos que alguien tenga una mejor solución.