我在 Swing 中工作,我想在特定类型的节点上禁用展开(加号 [+])符号。
不确定该怎么做,因为我的节点不是叶子节点,而且我也不能使用 setShowsRootHandles
(仅适用于根节点)。
我指的是 JTree:假设我有这个结构:
根
--[+] 节点1
--[+] 节点2
当我加载这个结构时,我不想在 node2 上看到 [+] 符号(因为它是一个特殊类型的节点)。但我也想通过使用特殊命令来扩展它。
我已经覆盖了 isLeaf()(来自 DefaultMutableTreeNode 的方法),因此当我处于特殊类型节点时它会设置为 TRUE,但是当我尝试扩展它时,它不会扩展,因为 isLeaf () == 真...
希望这会让事情变得更清楚。
最佳答案
虽然无法移除句柄,但可以限制节点的扩展。方法是将 TreeWillExpandListener 与具有限制扩展状态的自定义 treeNode 相结合:
- 下面的自定义节点有一个默认为 false 的可扩展属性
- 检测自定义节点时,监听器允许/否决基于该可扩展属性的扩展
- 为了程序化扩展,expandable属性暂时设置为true以传递给监听器
示例代码:
// mixed tree of normal/restricted noded
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
DefaultMutableTreeNode normalSubTree = new DefaultMutableTreeNode("normal");
normalSubTree.add(new DefaultMutableTreeNode("normalChild"));
MyNode restrictedSubTree = new MyNode("restrictedSubtree");
restrictedSubTree.add(new DefaultMutableTreeNode("restrictedChild"));
root.add(normalSubTree);
root.add(restrictedSubTree);
final JTree tree = new JTree(root);
// the listener which vetos expansion of MyNodes that are not expandable
TreeWillExpandListener l = new TreeWillExpandListener() {
@Override
public void treeWillExpand(TreeExpansionEvent event)
throws ExpandVetoException {
TreePath path = event.getPath();
if (path.getLastPathComponent() instanceof MyNode) {
if (!((MyNode) path.getLastPathComponent()).isExpandable()) {
throw new ExpandVetoException(event, "node not expandable");
}
}
}
@Override
public void treeWillCollapse(TreeExpansionEvent event)
throws ExpandVetoException {
}
};
tree.addTreeWillExpandListener(l);
Action expand = new AbstractAction("Expand") {
@Override
public void actionPerformed(ActionEvent e) {
TreePath selected = tree.getSelectionPath();
if (selected == null) return;
if (selected.getLastPathComponent() instanceof MyNode) {
MyNode last = (MyNode) selected.getLastPathComponent();
boolean old = last.isExpandable();
last.setExpandable(true);
tree.expandPath(selected);
last.setExpandable(old);
}
}
};
JXFrame frame = wrapWithScrollingInFrame(tree, "veto expand");
addAction(frame, expand);
show(frame);
}
// custom node which has an expandable property
public static class MyNode extends DefaultMutableTreeNode {
private boolean expandable;
public MyNode() {
this(null);
}
public MyNode(Object userObject) {
super(userObject);
}
public void setExpandable(boolean expandable) {
this.expandable = expandable;
}
public boolean isExpandable() {
return expandable;
}
}
关于java - 如何禁用 Swing JTree 中的扩展登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475422/