如何动态填充JTree?

时间:2012-11-07 17:12:02

标签: java swing loops tree nodes

我正在开发一个需要使用树数据结构的项目。做了一些研究之后,我发现Java JTree对我的项目非常有用,但是我偶然发现了一个问题,我花了一周时间修复但无济于事。

这就是问题,为了创建一个新节点,必须实例化DefaultMutableTreeNode,我不确定如何在循环中完成。通常,当我们想在JTree中创建一个新节点时,我们首先按以下方式声明节点:

DefaultMutableTreeNode parent = new DefaultMutableTreeNode("This is parent node.");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("This is child node.");

然后,为了将子节点添加/链接到父节点,我们将执行以下操作:

parent.add(child);

我有两个包含父节点和子节点的arraylists,它们在父子关系中相互对应,这意味着arraylistParent.get(x)将始终是arraylistChild.get(x)的父节点。

我在想通过使用for循环,我可以这样做:

for (int x = 0; x < arraylistParent.size(); x++){
    parent.add(new DefaultMutableTreeNode(arraylistChild.get(x)));
}

这只能在平面层次结构树中工作,显然对我来说并非如此。我将在arrayListParent中有不同的父节点,我需要在添加子节点之前检查它们,但是并非所有子节点都具有相同的单父节点。我的arraylists可能包含这样的东西:

arraylistParent = [root, p1, p2, p2, p3, p1]
arraylistChild = [p1, p2, p5, p3, p4, p5]

我想生成这样的树结构:

root
  ..p1
    ..p2
      ..p5          
      ..p3
        ..p4
    ..p5

显然,我可以在内部抛出一些if循环,以检查parent.getUserObject()是否与arraylistParent.get(x)相同,但只会检查并添加匹配字符串“This is parent node”的那些。 / p>

如果在循环中找到一个不同的,不存在的父项,则需要创建一个新的父项,这是我不知道如何解决的棘手部分,因为我不知道如何自动循环为子节点创建一个新的父实例。

1 个答案:

答案 0 :(得分:2)

让我们假设您的节点数据是字符串(即,ArrayLists的内容是字符串)。但是,该解释适用于任何其他Java对象。我们将这些内容称为“节点”,与“树节点”不同。

您可以创建HashMap<String, DefautMutableTreeNode> m,以便m.get(node)返回相应的TreeNode

现在,你必须迭代父母的arraylist。在每个职位,您将有一个父母和一个孩子。在地图中查找它们。如果父TreeNode不存在,您首先必须创建它。如果子TreeNode不存在,则同样适用。您应该确保在创建任何TreeNode后更新地图。最后,您将孩子标记为父母的孩子。

在此算法结束时,您应该查看子数组中的所有节点。没有父母的那个是根。这是你树的根。