创建动态JTree(控制根节点可见性)

时间:2009-12-16 19:56:53

标签: java swing jtree

我对如何动态生成JTree有疑问。有没有办法将根节点设置为不可见而不会使其子节点也不可见?我试图执行以下操作,但它将所有节点显示为不可见。请记住,我想在任何时间点添加和删除根节点的子节点。我添加了评论,因此您可以按照我打算做的事情。让我知道他们是否正在做我不需要的事情,因为我是JTrees的新手并且不了解惯例。我还希望能够为听众选择多个孩子。

    DefaultMutableTreeNode rootNode;
    rootNode = new DefaultMutableTreeNode(); //I want this invisible.

    DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
    JTree tree = new JTree(treeModel);

    treeModel.addTreeModelListener(this);
    tree.setRootVisible(false); // Sets everything invisible
    tree.setEditable(true); //makes tree dynamic
    tree.setShowsRootHandles(true); //supposedly allows you to see the children of the nodes.

    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
    //I would like the line above to be multi-select; however, this doesn't seem to be an option.

    DefaultMutableTreeNode table = new DefaultMutableTreeNode( "table1");
    rootNode.add(book);

    DefaultMutableTreeNode value = new DefaultMutableTreeNode( "value");
    table.add(value);

在上面的例子中。没有显示任何内容,当我删除“tree.setRootVisible(false)”时,包括节点在内的所有内容都可见。

4 个答案:

答案 0 :(得分:6)

答案非常晚,但我遇到了同样的问题。 确保扩展根节点,以便其子节点可见:

yourTree.expandPath(new TreePath(root.getPath()))

答案 1 :(得分:2)

我想说问题中的代码和TreeDemo中的代码之间的区别在于,在创建实际树之前,树演示会创建并添加其所有节点。如果要动态添加节点(在创建树之后),则应通过TreeModel完成。否则,将不会生成说树已更改的事件。至少这是教程似乎在编辑节点的“内容”时所说的,可能是同一个问题:

  

请注意,虽然DefaultMutableTreeNode具有更改a的方法   节点的内容,更改应通过DefaultTreeModel封面   方法。否则,将不会生成树模型事件,并且   树之类的听众不会知道更新。

Someone's solution

答案 2 :(得分:1)

对我来说很好。我在How to Use Trees上的Swing教程中对TreeDemo进行了测试。将您的代码与教程代码进行比较,看看有什么不同。

答案 3 :(得分:0)

一个非常晚的答案,我是一个java初学者并遇到同样的问题,所以它可能会有所帮助。

setRootVisible(false)也为我隐藏了所有节点,所以我添加了setShowsRootHandles(true)来显示所有节点:

tree.setRootVisible(false);
tree.setShowsRootHandles(true)

我希望它有所帮助! https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#display