Java 如何在从树中删除节点后阻止JTree崩溃
我正在制作一个JTree,我有一个按钮,可以从树中删除一个节点。每次我用按钮移除节点时,树就会自动折叠。我读过,因为我在用。重新加载。我还阅读了一些SO答案,其中建议使用.nodeChangednode,我已经尝试过了,但当我使用它时,我相信模型正在更新,但树不会相应地在GUI中重新加载。我怎样才能使这棵树不倒塌呢 这里是一个简单的SSCE,带有默认的JTree和一个删除节点的按钮Java 如何在从树中删除节点后阻止JTree崩溃,java,swing,jtree,treemodel,Java,Swing,Jtree,Treemodel,我正在制作一个JTree,我有一个按钮,可以从树中删除一个节点。每次我用按钮移除节点时,树就会自动折叠。我读过,因为我在用。重新加载。我还阅读了一些SO答案,其中建议使用.nodeChangednode,我已经尝试过了,但当我使用它时,我相信模型正在更新,但树不会相应地在GUI中重新加载。我怎样才能使这棵树不倒塌呢 这里是一个简单的SSCE,带有默认的JTree和一个删除节点的按钮 import java.awt.BorderLayout; import java.awt.event.*; im
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class StopTreeCollapse extends JApplet {
JTree tree = new JTree();
JButton jbtRemove = new JButton("Remove Node");
public StopTreeCollapse(){
add(new JScrollPane(tree), BorderLayout.CENTER);
add(jbtRemove, BorderLayout.SOUTH);
jbtRemove.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
TreePath[] paths = tree.getSelectionPaths();
if (paths == null) {
JOptionPane.showMessageDialog(null,
"No node in the tree is selected");
return;
}
DefaultMutableTreeNode node = null;
for (TreePath path : paths) {
node = (DefaultMutableTreeNode) (path.getLastPathComponent());
if (node.isRoot()) {
JOptionPane.showMessageDialog(null, "Cannot remove the root");
} else {
node.removeFromParent();
}
}
((DefaultTreeModel) tree.getModel()).reload();
}
});
}
}
reload本质上是说整个树可能已经改变了,忘记以前知道的一切,重新开始
请尝试使用node.removeFromParent,然后重新加载整个树,而不是使用node.removeFromParent
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
这将触发一个更具体的修改事件,告诉侦听器该特定节点已被删除,但树的其余部分未更改,因此您不再需要重新加载调用。重新加载本质上是说整个树可能已更改,忘记您以前知道的任何内容,然后重新开始
请尝试使用node.removeFromParent,然后重新加载整个树,而不是使用node.removeFromParent
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
这将触发一个更具体的修改事件,告诉侦听器该特定节点已被删除,但树的其余部分未更改,因此不再需要重新加载调用。DefaultTreeModel tree.getModel.removeNodeFromParentnode;仍然在为我折叠整个树,我从未调用过reload simply updateUIDefaultTreeModel tree.getModel.removeNodeFromParentnode;仍然在为我破坏整棵树,我从来没有简单地调用过reload updateUI