Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在折叠后不选择树节点_Java_Swing_Jtree_Collapse_Selected - Fatal编程技术网

Java 如何在折叠后不选择树节点

Java 如何在折叠后不选择树节点,java,swing,jtree,collapse,selected,Java,Swing,Jtree,Collapse,Selected,通常,我不希望自动选择折叠的节点。相反,我希望它的子节点在以前被选中时保持选中状态 在下面的SSCCE中,展开水果,然后选择香蕉。现在,通过单击水果节点图标左侧的折叠图标来折叠水果。“水果”节点将折叠,并且现在也处于选中状态 我希望香蕉节点在水果节点折叠后也保持选中状态。我怎样才能做到这一点 谢谢 SSCCE: import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.SwingUtilities; i

通常,我不希望自动选择折叠的节点。相反,我希望它的子节点在以前被选中时保持选中状态

在下面的SSCCE中,展开水果,然后选择香蕉。现在,通过单击水果节点图标左侧的折叠图标来折叠水果。“水果”节点将折叠,并且现在也处于选中状态

我希望香蕉节点在水果节点折叠后也保持选中状态。我怎样才能做到这一点

谢谢

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

由于似乎只有可见的节点才可能被选中,所以我提出了这个解决方案。在对事件进行调试之后,我发现当我折叠节点时,树总是无效的。 所以我覆盖了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();
            }

        }

    };

好的,只有可见的节点可以被选择——这在ui委托中得到了很深的处理,所以没有太多机会改变。如果你真的想要它,你可能必须保留你自己单独的selectionModel,并根据需要更新另一个我认为对于单树选择,你可以从触发扩展的鼠标事件中丢失选择/collapsed@mKorbel我不是以英语为母语的人,但你的句子似乎漏掉了什么。