[英]How to get JTree expanded?
我有一個帶有幾個屏幕的向導,用戶必須填寫他/她的詳細信息以便進一步處理。 在第二個屏幕上,我有一個帶有三個單選按鈕的無線電組,可以啟用其他元素。 要繼續,用戶必須選擇其中之一。 當用戶選擇第三個按鈕時,填充數據的單選JTree
啟用,用戶必須從中選擇一個選項。 然后用戶必須按“下一步”才能進入下一個屏幕。 他/她選擇的選項存儲為TreePath
。 到現在為止還挺好。
我的問題如下。 如果用戶想要從以下屏幕返回到帶有JTree
的屏幕,我想向他提供她已擴展到已選擇的選項的JTree
並突出顯示該選項。 但是,無論我嘗試做什么( expandPath
, scrollPathToVisible
, addSelectionPath
, makeVisible
任何組合)總是為我提供折疊樹。 我嘗試擴展葉子和節點。 我的代碼看起來像這樣:
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()
應該有效。
編輯:我更像是在使用DefaultMutableTreeNode
的Enumeration
:
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.