将注释插入JTree有困难

时间:2011-01-29 11:59:40

标签: java swing jtree

我有一个JTree,它是用以下方法构建的:
BKMNode类扩展DefaultMutableTreeNode,而DataNode只保存数据)

 void populateTree(BKMNode parent) {
    for (DataNode node : nodes) {
        BKMNode treeNode = new BKMNode(node.name,node.fullName,null);
        // check if this node was already added before
        if (! existingNodes.contains(ip + "." + node.fullName)) {
            existingNodes.add(ip + "." + node.fullName);
            DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
            model.insertNodeInto(treeNode, parent, parent.getChildCount());
            System.out.println("adding " + ip + "." + node.fullName);
        }
        node.populateTree(treeNode);
    }

// some more non-relevant code...

在应用程序启动时创建树时,一切都很好 但偶尔我的应用程序会使用相同的方法将节点添加到树中 当应用程序尝试向树中添加新节点时,会打印文本,但GUI上没有任何更改。 我尝试拨打JTree.invalidate()validate()repaint()reload(),但似乎没有任何帮助。

始终从populateTree调用EDT方法。

有谁知道这里的问题是什么?

提前多多感谢!

2 个答案:

答案 0 :(得分:3)

  

相信我,我尝试使用每一个无效,验证,重绘,重新加载方法

抱歉,我不相信你,人们总是犯愚蠢的错误。这就是为什么我们需要一个SSCCE来确切地了解你在做什么。话虽如此,没有理由调用任何这些方法。当您从Container中添加/删除组件时,将使用invalidate(),validate()。更新模型时,模型负责通知视图,以便视图可以重新绘制自己。

  

但GUI上没有任何变化

您希望改变什么?

插入节点会将节点插入模型中。如果父节点已展开,则是,您应该看到插入的节点。但是,如果父节点折叠,您将看不到更改。

如果要在插入节点后查看节点,则可以使用tree.expandPath(...)方法。

当我插入包含String值的默认节点时,您发布的基本代码对我来说很好。也许问题是你的自定义节点?因此,您需要做的第一件事是创建一个与默认节点一起使用的SSCCE。一旦工作,您可以使用自定义节点替换默认节点。如果它有效,那很好。如果不是,您知道问题是您的自定义节点。

根据提供的代码,它应该有效,所以你需要给我们更多的工作。

答案 1 :(得分:0)

解决!我在DefaultTreeModel的源代码中的“nodesWereInserted”方法中添加了一些断点,并使用调试器运行应用程序。它表明新节点添加了空父项!进一步调查显示问题 - node.populateTree(treeNode); line添加了新节点,而没有连接其indended parent。 这是新的(工作)代码。非常感谢您的帮助。

    void populateTree(BKMNode parent) {
    for (DataNode node : nodes) {
        BKMNode treeNode = new BKMNode(node.name,node.fullName,null);
        // check if this node was already added before
        if (! existingNodes.contains(ip + "." + node.fullName)) {
            existingNodes.add(ip + "." + node.fullName);
            DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
            model.insertNodeInto(treeNode, parent, parent.getChildCount());
            node.bkmNode = treeNode;
            node.populateTree(treeNode);
        } else {
            node.populateTree(node.bkmNode);
        }
    } // for