Java 如何在折叠后不选择树节点
通常,我不希望自动选择折叠的节点。相反,我希望它的子节点在以前被选中时保持选中状态 在下面的SSCCE中,展开水果,然后选择香蕉。现在,通过单击水果节点图标左侧的折叠图标来折叠水果。“水果”节点将折叠,并且现在也处于选中状态 我希望香蕉节点在水果节点折叠后也保持选中状态。我怎样才能做到这一点 谢谢 SSCCE: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
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我不是以英语为母语的人,但你的句子似乎漏掉了什么。