2010-06-02 79 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