【问题标题】:How to not select the tree node after collapsing折叠后如何不选择树节点
【发布时间】:2014-06-01 16:13:29
【问题描述】:

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

在下面的 SSCCE 中展开“水果”,然后选择“香蕉”。现在通过单击“Fruits”节点图标左侧的折叠图标来折叠“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();
            }
        });
    }
}

【问题讨论】:

  • afaik,只能选择可见节点——这是在 ui 委托中处理的,所以改变的机会不大。如果您真的想要它,您可能必须保留自己的单独 selectionModel 并根据需要更新另一个
  • 我认为对于 SINGLE_TREE_SELECTION,您可以从触发展开/折叠的鼠标事件中丢失选择
  • @mKorbel 我的母语不是英语,但你的句子似乎漏掉了什么。

标签: java swing jtree collapse selected


【解决方案1】:

因为除非可见,否则似乎无法选择节点,所以我想出了这个解决方案。在对事件进行调试后,我发现当我折叠一个节点时,树总是“无效”的。 所以我在 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();
            }

        }

    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多