Java 遍历多级JTree的所有节点
我有一个带有DefaultTreeModel的JTree。我需要找到它的每个节点 想象我有一棵树:Java 遍历多级JTree的所有节点,java,swing,jtree,Java,Swing,Jtree,我有一个带有DefaultTreeModel的JTree。我需要找到它的每个节点 想象我有一棵树: [A] |-[B] |-[C] |-[D] | |-[E] | |-[F] | |-[G] | |-[H] |-[I] |-[J] |-[K] 我需要遍历它并打印出: ---[A]--- >[B] >[C] >---[D]--- >>---[E]--- >>>[F]
[A]
|-[B]
|-[C]
|-[D]
| |-[E]
| |-[F]
| |-[G]
| |-[H]
|-[I]
|-[J]
|-[K]
我需要遍历它并打印出:
---[A]---
>[B]
>[C]
>---[D]---
>>---[E]---
>>>[F]
>>>[G]
>>>[H]
>>+++[E]+++
>+++[D]+++
>[I]
>[J]
>[K]
---[A]---
所以,我正在使用
java.util.Enumeration en = root.preorderEnumeration();
while (en.hasMoreElements()) {}
但是我不能想出一个有效的函数。在启动一个节点时,我需要输入---NODE NAME---,然后用+++NODE NAME+++结束该节点,但我无法这样做。如果只有一个父节点不是另一个父节点的最后一个元素,那么它就可以工作到一定程度。但当最后一个节点也是父节点时,它会中断。任何帮助都将不胜感激
编辑:
while (en.hasMoreElements()) {
nodeTemp = node;
node = (DefaultMutableTreeNode) en.nextElement();
String nodeName = node.toString();
if (node.getChildCount() > 0) {
System.out.println("---" + nodeName + "---");
} else {
if (nodeTemp.getChildCount() == 0 && nodeTemp.getParent() != node.getParent()) {
System.out.println("+++" + nodeName + "+++");
loopCount++;
}
System.out.println(nodeName);
}
loopCount++;
}
现在我发现它甚至没有我想象的那么好。这是我当前的输出:
----root (81)----
name
time
displaySize
----New Group1----
BaseX
BaseY
----New Group2----
BaseRadius
----New Group3----
Angle
DistanceFromCenter
++++New Group3++++
PlayerSpeed
MouseX
MouseY
++++New Group3++++
PlayerX
PlayerY
BonusSpawned
actorTags
++++New Group3++++
BonusTime
BonusWhich
+++root+++
Edit2:
while (en.hasMoreElements()) {
nodeTemp = node;
node = (DefaultMutableTreeNode) en.nextElement();
String nodeName = node.toString();
if (node.getChildCount() > 0) {
System.out.println("---" + nodeName + "---");
} else {
if (nodeTemp.getChildCount() == 0 && nodeTemp.getParent() != node.getParent()) {
System.out.println("+++" + nodeName + "+++");
loopCount++;
}
System.out.println(nodeName);
}
loopCount++;
}
网络搜索“深度优先树行”和/或“宽度优先树行”。前者更常见,但后者也有应用
如果树节点是双链接的(如果节点可以到达其父节点和子节点),则存在深度优先解决方案,其唯一状态是当前节点。否则,您将需要维护一个堆栈(作为数据结构,或通过递归方式),以便在分支的给定级别上的兄弟节点用完后可以返回。使用递归,您可以执行类似于此伪代码的操作
编辑递归方法的我的版本
public static void print(DefaultMutableTreeNode aNode)
{
String name = aNode.toString();
int level= aNode.getLevel();
String placement = "";
while (level > 0)
{
placement += ">";
level--;
}
if(aNode.isLeaf())
{
System.out.println(placement + name);
return;
}
System.out.println(placement + "--- " + name + " ---");
for(int i = 0 ; i < aNode.getChildCount() ; i++)
{
print((DefaultMutableTreeNode)aNode.getChildAt(i));
}
System.out.println(placement + "+++ " + name + " +++");
}
我通过放弃枚举并构建自己的函数解决了这个问题:
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
printNode(root);
public void打印节点(DefaultMutableTreeNode节点){
int childCount=node.getChildCount();
System.out.println(“--”+节点.toString()+“--”);
for(int i=0;i0){
printNode(childNode);
}否则{
System.out.println(childNode.toString());
}
}
System.out.println(“+++”+节点.toString()+“+++”);
}
到目前为止,您有什么以及它输出了什么?@JavaDevil我更新了这个问题,但您看到它根本不起作用,所有组的结尾都是相同的。我就是想不起来。这有点像我一直在做的事情,但是我应该如何在深入时存储外部节点的名称呢?我需要以“--”开头的组名,以“+++”结尾。看看我的输出,它用最内部的一个(3)关闭每个组。如果使用递归方法,则不需要存储任何内容。你能编辑包含你的代码吗?我更新了代码。我不知道我是否明白你的意思。我如何知道何时离开一个组,以便添加System.out.println(“+++”+nodeName+“+++”)代码>这比我想象的要简单得多,谢谢你给我指点递归函数。干得好,我正要编辑我的帖子,加入一个做同样事情的类似函数!谢谢现在我想让它更漂亮。我想在节点名的开头添加字符'>',如果它们是叶。如果其父级也有父级,则应该有2'>',依此类推。我直到现在都失败了,但我想我需要先喝杯咖啡。:)如果我以后再次失败,你可以在这里再次发布你的建议吗?请参阅我原来的帖子-我补充了我的方法