Reputation: 31
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.
Upvotes: 1
Views: 433
Reputation: 9808
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);
});
}
}
Upvotes: 1