2017-10-10 80 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); 
    }); 
    } 
} 
相關問題