我有一个 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);
}
//一些更多不相关的代码...
当应用程序启动时创建树时,一切都很好。
但有时我的应用程序会使用相同的方法将节点添加到树中。
当应用程序尝试向树中添加新节点时,会打印文本,但 GUI
上没有任何变化。
我尝试调用 JTree.invalidate()
、validate()
、repaint()
、reload()
但没有任何结果似乎有帮助。
populateTree
方法始终从 EDT
调用。
有谁知道这里有什么问题吗?
提前非常感谢!
最佳答案
Trust me, I tried using every invalidate, validate, repaint, reload method
抱歉,我不相信你,人们总是会犯愚蠢的错误。这就是为什么我们需要 SSCCE 来准确了解您在做什么。话虽如此,没有理由调用任何这些方法。当您从容器中添加/删除组件(您尚未执行此操作)时,将使用 invalidate()、validate()。当您更新模型时,模型负责通知 View ,以便 View 可以重新绘制自身。
but nothing changes on the GUI
您期望改变什么?
插入节点会将节点插入到模型中。如果父节点已展开,那么您应该看到插入的节点。但是,如果父节点折叠,您将看不到任何变化。
如果您想在插入节点后查看该节点,则可以使用tree.expandPath(...)方法。
当我插入包含字符串值的默认节点时,您发布的基本代码对我来说效果很好。也许问题是你的自定义节点?因此,您需要做的第一件事是创建一个与默认节点一起使用的 SSCCE。一旦成功,您就可以用自定义节点替换默认节点。如果有效的话,那就太好了。如果不是,您就知道问题出在您的自定义节点上。
根据提供的代码,它应该可以工作,因此您需要给我们更多的帮助。
关于java - 将注释插入 JTree 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836723/