3

我有一个带有多个屏幕的向导,用户必须在其中填写他/她的详细信息以进行进一步处理。在第二个屏幕上,我有一个带有三个单选按钮的单选组,这些单选按钮可以启用其他元素。要继续,用户必须选择其中之一。当用户选择第三个按钮时,JTree填充数据的单选启用,用户必须从中选择一个选项。然后用户必须按“下一步”才能进入下一个屏幕。他\她选择的选项存储为TreePath. 到现在为止还挺好。

我的问题如下。如果用户想从下一个屏幕返回到带有 a 的屏幕JTree,我想为他\她提供JTree已选择的选项的扩展并突出显示该选项。但是,无论我为此尝试做什么(任何组合expandPath, scrollPathToVisible, addSelectionPath, makeVisible)总是为我提供一棵倒塌的树。我尝试扩展叶子和节点。我的代码如下所示:

rbProcessJTree.setSelected(isProcessJTree());

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

调用时setSelected(),将调用启用JTree. 模型在表单初始化期间加载。

每次在屏幕之间切换时,我都会保存前一个屏幕的输入数据并处理它。然后,当我需要打开前一个屏幕时,我从下一个屏幕保存数据,处理它,将数据加载到这个屏幕并显示它。所以每次屏幕都是从头开始生成的。

您能否解释一下,必须执行哪些操作顺序才能JTree在新创建的表单中进行扩展,加载数据模型并提供选择路径?

4

2 回答 2

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

于 2010-06-02T08:39:39.170 回答
1

如果您正在使用DefaultMutableTreeNode,您可以随时使用 anEnumeration来搜索TreeNode您想要的。如果是真的,那么setSelectionPath()应该工作。getExpandsSelectedPaths()

编辑:我想更像是使用Enumerationfrom 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);
于 2010-06-02T13:51:31.260 回答