Java 如何在选择和展开另一个节点时自动折叠JTree节点
我想实现一个需求,在这个需求中,我必须在选择或双击另一个节点时折叠JTree的所有子节点 我有多个服务器的树状视图,当我点击一个服务器节点时,我正在维护它,我选择了哪个服务器(lastSelectedServerName),同时所有其他服务器节点都应该折叠Java 如何在选择和展开另一个节点时自动折叠JTree节点,java,swing,Java,Swing,我想实现一个需求,在这个需求中,我必须在选择或双击另一个节点时折叠JTree的所有子节点 我有多个服务器的树状视图,当我点击一个服务器节点时,我正在维护它,我选择了哪个服务器(lastSelectedServerName),同时所有其他服务器节点都应该折叠 public void populateGroupsfloorsTree(List<ServerInfo> serversList) { this.clear(); servers = serversList;
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();
}
}
public void populateGroupsfloorsTree(列表服务器列表){
这个.clear();
服务器=服务器列表;
用于(服务器信息服务器:服务器){
ToolTipTreeNode serverNode=GROUPS\u FLOOR\u TREE.addServer(服务器);
对于(组:server.getGroupFoor()){
ToolTipTreeNode groupNode=GROUPS\u FLOOR\u TREE.addGroup(服务器节点,组);
对于(GroupFloor:group.getGroupFloors()){
GROUPS\u FLOOR\u TREE.addGroupFloor(groupNode,FLOOR);
}
}
}
String lastSelectedServerName=(String)Main.getInstance().getSettings()
.getValue(AppSettings.Property.LAST_SELECTED_SERVER,默认_SERVER);
字符串lastSelectedGroupId=(字符串)Main.getInstance().getSettings()
.getValue(AppSettings.Property.LAST_SELECTED_GROUP,默认_GROUP);
String lastSelectedFloorId=(String)Main.getInstance().getSettings()
.getValue(AppSettings.Property.LAST_SELECTED_FLOOR,默认_FLOOR);
expandGroupSelectedFloor(lastSelectedServerName、lastSelectedGroupId、lastSelectedFloorId);
}//populateGroupsfloorsTree方法的结尾。
public void expandGroupSelectedFloor(字符串servername、字符串groupId、字符串floorId){
试一试{
if(((默认组).equals(组ID)| |(默认地板).equals(地板))
||(“”).等于(服务器名)| |(“”).等于(组ID)| |(“”).等于(floorId)){
选择DefaultFloor();
}else if(guibuilder1.getGroupsFloorModel().getGroupFromID(groupId)==null
||GUIBuildServer1.getGroupsFloorModel().getGroupFloorFromUUID(
UUID.fromString(floorId))==null){
选择DefaultFloor();
}否则{
Group Group=guibuildserver1.getGroupsFloorModel().getGroupFromID(groupId);
如果(组!=null){
字符串groupName=group.getName();
ToolTipTreeNode groupNode=getGroupNode(groupName);
if(groupNode!=null){
//选择楼层。
枚举层=groupNode.depthFirstEnumeration();
while(floors.hasMoreElements()){
ToolTipTreeNode节点=floors.nextElement();
if(node.getId().equals(floorrid)){
树路径=新树路径(node.getPath());
tree.setSelectionPath(路径);
}
}
}否则{
选择DefaultFloor();
}
}
}
}捕获(例外e){
选择DefaultFloor();
}
}
在下图中,Localhost和shilpa是服务器节点。因此,当我单击shilpa时,Localhost服务器节点将崩溃。也许您可以使用
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);
});
}
}