简体   繁体   中英

How to automatically collapse JTree Node on selecting and expanding another node

I want to implement a requirement where in I have to collapse all child nodes of JTree on selecting or double clicking another node.

I have Treeview of multiple servers in which when I click on a sever node, I am maintaining it which server I have selected (lastSelectedServerName) at same time all other server nodes should be collapsed.

public void populateGroupsfloorsTree(List<ServerInfo> serversList) {
    this.clear();
    servers = serversList;
    for (ServerInfo server : servers) {
        ToolTipTreeNode serverNode = GROUPS_FLOOR_TREE.addServer(server);
            for (Group group : server.getGroupFoor()) {
                ToolTipTreeNode groupNode = GROUPS_FLOOR_TREE.addGroup(serverNode, group);
                for (GroupFloor floor : group.getGroupFloors()) {
                    GROUPS_FLOOR_TREE.addGroupFloor(groupNode, floor);
                }
            }
    }
    String lastSelectedServerName = (String) Main.getInstance().getSettings()
            .getValue(AppSettings.Property.LAST_SELECTED_SERVER, DEFAULT_SERVER);
    String lastSelectedGroupId = (String) Main.getInstance().getSettings()
            .getValue(AppSettings.Property.LAST_SELECTED_GROUP, DEFAULT_GROUP);
    String lastSelectedFloorId = (String) Main.getInstance().getSettings()
            .getValue(AppSettings.Property.LAST_SELECTED_FLOOR, DEFAULT_FLOOR);
    expandGroupSelectedFloor(lastSelectedServerName, lastSelectedGroupId, lastSelectedFloorId);

}// End of populateGroupsfloorsTree method.

public void expandGroupSelectedFloor(String servername ,String groupId, String floorId) {
    try {
        if (((DEFAULT_GROUP).equals(groupId) || (DEFAULT_FLOOR).equals(floorId))
                || ("").equals(servername) || ("").equals(groupId) || ("").equals(floorId)) {
            selectDefaultFloor();
        } else if (GUIBuilderVer1.getGroupsFloorModel().getGroupFromID(groupId) == null
                || GUIBuilderVer1.getGroupsFloorModel().getGroupFloorFromUUID(
                        UUID.fromString(floorId)) == null) {
            selectDefaultFloor();
        } else {
            Group group = GUIBuilderVer1.getGroupsFloorModel().getGroupFromID(groupId);
            if (group != null) {
                String groupName = group.getName();
                ToolTipTreeNode groupNode = getGroupNode(groupName);
                if (groupNode != null) {
                    // Selecting Floor.
                    Enumeration<ToolTipTreeNode> floors = groupNode.depthFirstEnumeration();
                    while (floors.hasMoreElements()) {
                        ToolTipTreeNode node = floors.nextElement();
                        if (node.getId().equals(floorId)) {
                            TreePath path = new TreePath(node.getPath());
                            tree.setSelectionPath(path);
                        }
                    }
                } else {
                    selectDefaultFloor();
                }
            }
        }
    } catch (Exception e) {
        selectDefaultFloor();
    }
}

In Below image Localhost and shilpa is server node.so when I click on shilpa ,Localhost server node will be collapse.

Maybe you can use a TreeWillExpandListener

import java.awt.*;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;

public class ToggleTreeNodeGroupExample {
  public JComponent makeUI() {
    JTree tree = new JTree();
    tree.setRootVisible(false);
    tree.addTreeWillExpandListener(new TreeWillExpandListener() {
      private boolean isAdjusting;
      @Override
      public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException {
        // collapseAll(tree); // StackOverflowError when collapsing nodes below 2nd level
        if (isAdjusting) {
          return;
        }
        isAdjusting = true;
        collapseFirstHierarchy(tree);
        tree.setSelectionPath(e.getPath());
        isAdjusting = false;
      }
      @Override
      public void treeWillCollapse(TreeExpansionEvent e) throws ExpandVetoException {
        //throw new ExpandVetoException(e, "Tree collapse cancelled");
      }
    });
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(tree));
    return p;
  }
  private static void collapseFirstHierarchy(JTree tree) {
    TreeModel model = tree.getModel();
    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    Enumeration e = root.breadthFirstEnumeration();
    while (e.hasMoreElements()) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
      if (node.getLevel() > 1) { // Collapse only nodes in the first hierarchy
        return;
      } else if (node.isLeaf() || node.isRoot()) {
        continue;
      }
      tree.collapsePath(new TreePath(node.getPath()));
    }
  }
//   private static void collapseAll(JTree tree) {
//     int row = tree.getRowCount() - 1;
//     while (row >= 0) { // The root node must be hidden
//       tree.collapseRow(row--);
//     }
//   }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new ToggleTreeNodeGroupExample().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM