折叠后如何不选择树节点

时间:2014-04-17 11:48:56

标签: java swing jtree collapse selected

一般情况下,我不想要自动选择折叠节点。相反,我希望它的子节点在之前被选中时保持选中状态。

在下面的SSCCE中展开" Fruits"然后选择" banana"。现在崩溃"水果"点击" Fruits"左边的折叠图标节点的图标。 "水果"节点崩溃,现在也被选中。

我想要"香蕉"在" Fruits"之后也留下选择的节点节点已折叠。我怎么能做到这一点?

谢谢!

SSCCE:

    import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;

public class TreeExample extends JFrame
{
    private final JTree tree;

    public TreeExample()
    {
        //create the root node
        final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        //create the child nodes
        final DefaultMutableTreeNode vegetableNode = new DefaultMutableTreeNode("Vegetables");
        final DefaultMutableTreeNode fruitNode = new DefaultMutableTreeNode("Fruits");

        final DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("apple");
        final DefaultMutableTreeNode bNode = new DefaultMutableTreeNode("banana");
        final DefaultMutableTreeNode cNode = new DefaultMutableTreeNode("coconut");
        final DefaultMutableTreeNode dNode = new DefaultMutableTreeNode("date");

        fruitNode.add(aNode);
        fruitNode.add(bNode);
        fruitNode.add(cNode);
        fruitNode.add(dNode);

        //add the child nodes to the root node
        root.add(vegetableNode);
        root.add(fruitNode);

        //create the tree by passing in the root node
        this.tree = new JTree(root);
        this.add(this.tree);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("JTree Example");
        this.pack();
        this.setVisible(true);
    }

    public static void main(final String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new TreeExample();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

由于似乎除非可见,否则无法选择节点,我想出了这个解决方案。调试完事件后,我发现树总是“无效”#34;当我崩溃一个节点。 所以我在JTree中覆盖了fireValueChange()。如果树是有效的"我让价值变化发生了。否则我清除选择。 如果我不清除选择,则会在UI中选择折叠节点,这会给出错误的印象,因为它没有在逻辑上选择。通过清除选择,可以明确选择折叠节点。 这个解决方案最接近我想要的。如果我再次展开先前折叠的节点,那么唯一缺少的是被选中的不可见节点。

到目前为止它对我来说效果很好:

this.tree = new JTree(this.rootNode)
    {
        @Override
        protected void fireValueChanged(final TreeSelectionEvent e)
        {
            if (this.isValid())
                super.fireValueChanged(e);
            else
            {
                super.clearSelection();
            }

        }

    };