如何从树中删除节点后停止JTree折叠

时间:2013-12-04 10:58:39

标签: java swing jtree treemodel

我正在创建一个JTree,我有一个从树中删除节点的按钮。每次我使用按钮删除节点时,树会自动折叠。我读过这是因为我正在使用.reload()。我还阅读了一些建议使用.nodeChanged(node)的SO答案,我已经尝试了但是当我使用它时,我相信模型正在更新,但树不会在GUI中相应地重新加载。如何让树不崩溃?

这是一个带有默认JTree的简单SSCCE和一个删除节点的按钮

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();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:4)

reload()基本上说“整棵树可能已经改变,忘记了之前你所知道的任何事情并重新开始”。

尝试

,而不是使用node.removeFromParent()然后重新加载整个树
((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node);

这将触发一个更具体的修改事件,告诉侦听器该特定节点已被删除但树的其余部分未更改,因此您不再需要reload()调用。