[英]How to disable expand sign in Swing JTree?
我在Swing工作,我想在某種類型的節點上禁用擴展(加[+])符號。
不知道怎么做,因為我的節點不是葉子,我也不能使用setShowsRootHandles
(僅用於root)。
我指的是JTree:假設我得到了這個結構:
根
- [+] node1
- [+] node2
當我加載這個結構時,我不想在node2上看到[+]符號(因為它是一個特殊的類型節點)。 但我也想通過使用特殊命令來擴展它。
我重寫了isLeaf()(來自DefaultMutableTreeNode的方法),所以當我在特殊類型節點時它會設置為TRUE,但是當我試圖擴展它時,它不會擴展,因為isLeaf()= = TRUE ......
希望這會使事情變得更加清晰。
雖然無法移除句柄,但可以限制節點的擴展。 要走的路是TreeWillExpandListener與自定義treeNode結合使用,該樹狀態具有限制擴展的狀態:
示例代碼:
// 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;
}
}
除非其他人提到過,否則可以移除手柄。 我已經附上了一個如何在下面執行此操作的片段。 關鍵是在BasicTreeUI
覆蓋shouldPaintExpandControl
。
jtree.setUI(new BasicTreeUI() {
@Override
protected boolean shouldPaintExpandControl(final TreePath path, final int row
, final boolean isExpanded, final boolean hasBeenExpanded, final boolean isLeaf)
{
boolean shouldDisplayExpandControl = false;
return shouldDisplayExpandControl;
}
這應該在JTree API中記錄,但這是另一個問題。
另一種考慮方法:
如果調用DefaultTreeModel(TreeNode root, boolean asksAllowsChildren)
,模型將“詢問”您插入的節點(如果允許它們生成子節點)。 如果他們不能,則不應顯示展開圖標。
請務必在您的類中覆蓋javax.swing.tree.TreeNode.getAllowsChildren()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.