簡體   English   中英

如何擴展JTree?

[英]How to get JTree expanded?

我有一個帶有幾個屏幕的向導,用戶必須填寫他/她的詳細信息以便進一步處理。 在第二個屏幕上,我有一個帶有三個單選按鈕的無線電組,可以啟用其他元素。 要繼續,用戶必須選擇其中之一。 當用戶選擇第三個按鈕時,填充數據的單選JTree啟用,用戶必須從中選擇一個選項。 然后用戶必須按“下一步”才能進入下一個屏幕。 他/她選擇的選項存儲為TreePath 到現在為止還挺好。

我的問題如下。 如果用戶想要從以下屏幕返回到帶有JTree的屏幕,我想向他提供她已擴展到已選擇的選項的JTree並突出顯示該選項。 但是,無論我嘗試做什么( expandPathscrollPathToVisibleaddSelectionPathmakeVisible任何組合)總是為我提供折疊樹。 我嘗試擴展葉子和節點。 我的代碼看起來像這樣:

rbProcessJTree.setSelected(isProcessJTree());

if (null != getSelectedTablePath()){
    trTables.addSelectionPath(getSelectedTablePath());
    trTables.expandPath(getSelectedTablePath());
    trTables.scrollPathToVisible(getSelectedTablePath());
}

setSelected() ,將調用啟用JTree狀態更改偵聽器。 在表單初始化期間加載模型。

每次在屏幕之間切換時,我都會保存上一屏幕的輸入數據並進行處理。 然后,當我需要打開前一個屏幕時,我從以下屏幕保存數據,處理它,將數據加載到該屏幕並顯示它。 所以每次屏幕都是從頭開始生成的。

您能否解釋一下,為了在新創建的表單中擴展JTree ,加載數據模型和提供選擇路徑,需要執行哪些操作?

這是我用來記錄JTree中的擴展和選定路徑的一些代碼。 您可以在Next和Back頁面之間記錄狀態內容。

// record expanded nodes to reinstate later; 
TreePath rootPath= new TreePath(objectWeKnowIsAtRoot);

Enumeration<TreePath> expandedPaths = tree.getExpandedDescendants(rootPath);

// record current-selection - it's OK if it's null
TreePath selectedPath = tree.getSelectionPath();


// ******* do stuff that may, and often will, modify our tree content ********


// restore valid expansion paths (some may - correctly - have been removed in modifications)
while (expandedPaths != null && expandedPaths.hasMoreElements())
{
    TreePath path = expandedPaths.nextElement();
    if (isPathValid(path))
    {
        tree.expandPath(path);
    }
}

// restore selected path, if apt
if (isPathValid(selectedPath))
{
    tree.setSelectionPath(selectedPath);
}

上面使用的isValidPath()方法基於以下方法:

http://forums.sun.com/thread.jspa?threadID=567157&tstart=38085

如果您使用的是DefaultMutableTreeNode ,則始終可以使用Enumeration搜索所需的TreeNode 如果getExpandsSelectedPaths()為true,則setSelectionPath()應該有效。

編輯:我更像是在使用DefaultMutableTreeNodeEnumeration

JTree tree = new JTree();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
...
private TreePath find(DefaultMutableTreeNode root, String s) {
    Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
    while (e.hasMoreElements()) {
        // return match
    }
    return null;
}

然后你可以這樣做:

TreePath path = find(root, "pizza");
tree.setSelectionPath(path);
tree.scrollPathToVisible(path);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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