java - 从树中删除节点后如何阻止 JTree 崩溃

标签 java swing jtree treemodel

我正在制作一个 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/

相关文章:

java - 500 内部服务器错误,获取请求时出现 NullPointerException

java - JTree 节点未更新(在 Scala 中)

java - 在 2 个 Jtree 之间拖放

java - 如何访问添加到尚未声明的 JPanel 的 swing 组件?

java - 设置整个JPanel的透明颜色

java - 如何在显示后调整 TreeCellEditor 的大小

java - 如何在 swt 工具提示上隐藏程序名称

java - 如何使用泛型将重复的方法与具有包含相同类类型的不同 Java 集合的参数组合起来?

java - 如何阻止 java replaceAll() 删除反斜杠?

Java 等待线程完成