【问题标题】:How to automatically collapse JTree Node on selecting and expanding another node如何在选择和展开另一个节点时自动折叠 JTree 节点
【发布时间】:2017-10-10 06:34:28
【问题描述】:

我想实现一个要求,我必须在选择或双击另一个节点时折叠 JTree 的所有子节点。

我有多个服务器的 Treeview,当我单击服务器节点时,我会维护它我选择的服务器 (lastSelectedServerName),同时所有其他服务器节点都应该折叠。

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();
    }
}

在下图中,本地主机和 shilpa 是服务器节点。所以当我点击 shilpa 时,本地主机服务器节点会崩溃。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    也许你可以使用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);
        });
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多