我有一个带有多个屏幕的向导,用户必须填写他/她的详细信息以便进一步处理。在第二个屏幕上,我有一个带有三个单选按钮的无线电组,可以启用其他元素。要继续,用户必须选择其中之一。当用户选择第三个按钮时,单个选择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
需要执行哪些操作,加载数据模型并提供选择路径?
答案 0 :(得分: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
答案 1 :(得分:1)
如果您使用的是DefaultMutableTreeNode
,则可以随时使用Enumeration
搜索所需的TreeNode
。如果setSelectionPath()
为真,则getExpandsSelectedPaths()
应该有效。
编辑:我在考虑使用Enumeration
中的DefaultMutableTreeNode
:
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);