2010-06-02 80 views
3

我有一個有幾個屏幕的嚮導,用戶必須填寫他/她的詳細信息以便進一步處理。在第二個屏幕上,我有一個帶有三個單選按鈕的收音機組,可以啓用其他元素。要繼續,用戶必須選擇其中之一。當用戶選擇第三個按鈕時,單選JTree填入數據啓用,用戶必須從中選擇一個選項。然後用戶必須按「下一步」才能進入下一個屏幕。他選擇的選項存儲爲TreePath。到現在爲止還挺好。如何讓JTree擴展?

我的問題如下。如果用戶想要從下面的屏幕回到JTree的屏幕,我想爲他提供\ JTree擴展到已選擇的選項,並突出顯示該選項。然而,無論我爲此嘗試做什麼(任何組合expandPath,scrollPathToVisible,addSelectionPath,makeVisible)都會爲我提供摺疊樹。我嘗試擴展葉子和節點。我的代碼如下所示:

rbProcessJTree.setSelected(isProcessJTree()); 

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

setSelected()被調用時,狀態變化監聽器被調用,使JTree。該模型在表單初始化期間被加載。

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

請問您能解釋一下,在新創建的表單中,如何獲得JTree擴展的操作順序?請提供數據模型並提供選擇路徑?

+0

你好Dzmitry Zhaleznichenka,是你能得到的回答你的問題?我面臨同樣的問題,我已經在這裏發佈

http://stackoverflow.com/questions/6252462/jtree-lazy-load-expand
請指教。 – ShamsR 2011-06-06 13:42:23

回答

1

下面是我用來在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

+0

我已經嘗試了這種方法,但它也不起作用。不知道原因。後來看到在枚舉中返回的路徑具有隨機順序,將它們轉換爲ArrayList並從根開始排序,而不是嘗試使用它。沒有機會。爲所選路徑本身添加了expandPath()。沒門。沒有想法。謝謝你的迴應。順便說一句,當我調試它時,我發現我的選擇路徑isVisible()是true,但isExpanded()是false。它可以幫助嗎? – 2010-06-02 09:27:20

+0

嗯;數據填充後,你肯定是在做選擇/擴展的東西嗎?你可以嘗試的是向你的嚮導添加一個「調試這個」按鈕,當你按下這個按鈕時,它會進行選擇/擴展,讓你有機會直觀地確認是否所有的數據都存在並且首先是正確的? – Brian 2010-06-02 09:44:37

+0

完成當前任務後,我會在一個小時左右嘗試。但是,調試時isPathValid()始終返回true,並且在您的算法中執行expandPath()方法。這應該意味着數據已經被填充了,不是嗎? 我在初始化表單時填充數據模型。只有在那之後,我纔會嘗試用它來執行一些操作。也許需要探索一下我的狀態改變監聽器的單選按鈕。在我開始使用樹木處理方法之前,它會觸發數次。 – 2010-06-02 11:04:21

1

如果您使用DefaultMutableTreeNode,你可以隨時使用Enumeration來搜索你想要的TreeNode。那麼setSelectionPath()應該工作,如果getExpandsSelectedPaths()爲真。

編輯:我想更像是在使用從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); 
+0

列表 tpa = treeStorage.getExpandedPathsList();如果(空!= tpa){ Collections.sort(tpa,new TreePathComparator()); (TreePath t:tpa){ if(isPathValid(t)){ trTables.expandPath(t); } } } if(isPathValid(treeStorage.getSelectedTablePath())){ trTables.setSelectionPath(treeStorage.getSelectedTablePath()); System.out.println(「expanded:」 + trTables.getExpandsSelectedPaths()); } 此代碼返回true。但是,樹仍然崩潰。枚舉以隨機順序返回結果,無法重置,因此我將其更改爲ArrayList。格式化抱歉。 – 2010-06-03 06:45:33