我有一个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
方法。
有谁知道这里的问题是什么?
提前多多感谢!
答案 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