java - 如何在选择和展开另一个节点时自动折叠 JTree 节点

标签 java swing

我想实现一个要求,在选择或双击另一个节点时必须折叠 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();
    }
}

在下图中,Localhost 和 shilpa 是服务器节点。所以当我点击 shilpa 时,Localhost 服务器节点将崩溃。

最佳答案

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

关于java - 如何在选择和展开另一个节点时自动折叠 JTree 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46660028/

相关文章:

java - 查询sql数据库中的索引表与使用自己的HashMap

java - 当没有创建资源时,我应该为 POST 返回什么 HTTP 状态代码?

java - java中通过复制方法缩放图像

java - 逐行显示JTable

java - 如何使用其中包含 actionPerformed 的 IF 语句从另一个类检查一个类中的 JToggleButton 状态?

Java:无法在 try 之外返回变量?

java - 如何从服务器下载文件到插件的内部存储目录

java - jsoup 获取 HTML 失败(缺少某些部分)

java - 避免在 Android 设备上的应用程序设置中单击 'clear data' 按钮时从数据库中删除数据

Java定时器,每秒更新一次