我想从JTree中删除每个节点,除了我想要保留的根节点。我正在尝试使用递归方法:
public void removeMeasurement (Long ID){
removeMeasurement(root, ID);
collapseAll();
expandAll();
}
public void removeMeasurement (MutableTreeNode nodo, Long ID){
if (nodo.getChildCount() >= 0) {
for (Enumeration e=nodo.children(); e.hasMoreElements(); ) {
MutableTreeNode n = (MutableTreeNode)e.nextElement();
removeMeasurement(n, ID);
}
}
if(ID==0){
nodo.removeFromParent();
Register.debug("Eliminando ["+nodo.toString()+"]");
return;
}
else if(nodo.toString().toLowerCase().equals("curve "+ID)){
nodo.removeFromParent();
return;
}
}
所以,我的Tree有一些名为“curve”的节点+一些ID,我想用这个方法擦除其中一个及其所有子节点,但如果我用ID = 0调用该方法,我希望它删除每个来自JTree的节点。
它不起作用。它确实擦除了节点,但是当我添加节点时,擦除的节点也会出现新节点。如果它是被擦除的同一节点,它现在出现两次。怎么了?
注意:每次添加或删除节点时,我都会调用JTree的更新方法,手动刷新它。我在那里调用显示的方法来擦除每个节点,所以我可以添加那些应该保留的节点。
答案 0 :(得分:3)
根据我的理解,您要做的是删除ID等于给定ID的节点,是吗?然后,我建议您创建一个方法,给定一个ID,找到该节点,然后另一个方法来删除找到的节点。这样的事情(我假设您使用的是DefaultTreeModel
和DefaultMutableTreeNodes
):
DefaultMutableTreeNode findById(TreeModel treeModel, Long id) {
if (id == 0) {
return (DefaultMutableTreeNode) treeModel.getRoot();
}
String curveId = "curve " + id;
// The enumeration returns all the nodes, so it's not necessary to do a recursive search
Enumeration en = ((DefaultMutableTreeNode) treeModel.getRoot()).breadthFirstEnumeration();
while (en.hasMoreElements()) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
if (curveId.equalsIgnoreCase(node.toString()) {
return node;
}
}
}
void removeById(DefaultTreeModel treeModel, Long id) {
DefaultMutableTreeNode nodeToRemove = findById(treeModel, id);
if (nodeToRemove != null) {
if (nodeToRemove.isRoot()) {
nodeToRemove.removeAllChildren();
treeModel.nodeStructuredChanged(nodeToRemove); // To notify the JTree to update from the root
}
else {
treeModel.removeNodeFromParent(nodeToRemove); // Automatically notify the JTree
}
}
}