2017-10-10 79 views
1

我想要实现一个需求,在这里我必须在选择或双击另一个节点时折叠JTree的所有子节点。如何在选择和展开另一个节点时自动折叠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(); 
    } 
} 

在下面的图像本地主机和希尔帕是服务器node.so当我希尔帕点击,本地主机服务器节点会崩溃。

回答

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); 
    }); 
    } 
} 
相关问题