一般情况下,我不想要自动选择折叠节点。相反,我希望它的子节点在之前被选中时保持选中状态。
在下面的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();
}
});
}
}
答案 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();
}
}
};