我正在制作一个 JTree,并且有一个可以从树中删除节点的按钮。每次我使用按钮删除节点时,树都会自动折叠。我读到这是因为我正在使用 .reload()
。我还阅读了一些建议使用 .nodeChanged(node)
的答案,我已经尝试过,但是当我使用它时,我相信模型正在更新,但树没有重新加载相应地在 GUI 中。怎样才能让树不折叠?
这是一个简单的 SSCCE,带有默认的 JTree 和一个用于删除节点的按钮
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()
然后重新加载整个树,而是尝试
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);
这将触发一个更具体的修改事件,告诉监听器该特定节点已被删除,但树的其余部分未更改,因此您不再需要 reload()
调用。
关于java - 从树中删除节点后如何阻止 JTree 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20373509/