簡體   English   中英

如何在Swing JTree中禁用展開登錄?

[英]How to disable expand sign in Swing JTree?

我在Swing工作,我想在某種類型的節點上禁用擴展(加[+])符號。

不知道怎么做,因為我的節點不是葉子,我也不能使用setShowsRootHandles (僅用於root)。

我指的是JTree:假設我得到了這個結構:

- [+] node1

- [+] node2

當我加載這個結構時,我不想在node2上看到[+]符號(因為它是一個特殊的類型節點)。 但我也想通過使用特殊命令來擴展它。

我重寫了isLeaf()(來自DefaultMutableTreeNode的方法),所以當我在特殊類型節點時它會設置為TRUE,但是當我試圖擴展它時,它不會擴展,因為isLeaf()= = TRUE ......

希望這會使事情變得更加清晰。

雖然無法移除句柄,但可以限制節點的擴展。 要走的路是TreeWillExpandListener與自定義treeNode結合使用,該樹狀態具有限制擴展的狀態:

  • 下面的自定義節點具有可擴展屬性,默認情況下為false
  • 在檢測自定義節點時,偵聽器允許/否決基於該可擴展屬性的擴展
  • 對於程序化擴展,可擴展屬性暫時設置為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;
    }
}

除非其他人提到過,否則可以移除手柄。 我已經附上了一個如何在下面執行此操作的片段。 關鍵是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM