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

我的问题如下。如果用户想从下面的屏幕返回到带有JTree的屏幕,我想向他/她提供JTree扩展到已选择的选项并突出显示该选项。但是,无论我做什么,(expandPathscrollPathToVisibleaddSelectionPathmakeVisible的任何组合)总是为我提供折叠的树。我尝试扩展叶子和节点。我的代码如下所示:

rbProcessJTree.setSelected(isProcessJTree());

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

调用setSelected()时,将调用状态更改侦听器以启用JTree。在表单初始化期间加载模型。

每次在屏幕之间切换时,我都会保存上一屏幕的输入数据并进行处理。然后,当我需要打开上一个屏幕时,我保存下一个屏幕中的数据,进行处理,将数据加载到此屏幕中并显示出来。因此,每次屏幕都是从头开始生成的。

您能否解释一下,要以新创建的形式扩展JTree并加载数据模型并提供选择路径,必须执行哪些操作顺序?

最佳答案

这是一些我用来记录JTree中扩展和所选路径的代码。您可以在下一页和后一页之间记录状态信息。

// 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

关于java - 如何使JTree扩展?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2955914/

10-12 00:37