3

ユーザーがさらに処理するために詳細を入力する必要があるいくつかの画面を持つウィザードがあります。2 番目の画面には、追加要素を有効にする 3 つのラジオ ボタンを含むラジオ グループがあります。続行するには、ユーザーはそれらのいずれかを選択する必要があります。ユーザーが 3 番目のボタンを選択すると、データが入力された単一選択JTreeが有効になり、ユーザーはそこからオプションを選択する必要があります。次に、ユーザーは「次へ」を押して次の画面に進む必要があります。彼\彼女が選択したオプションは、TreePath. ここまでは順調ですね。

私の問題は次のとおりです。ユーザーが次の画面から の付いた画面に戻りたい場合は、選択されたオプションJTreeに展開されたオプションをユーザーに提供しJTree、オプションを強調表示したいと考えています。ただし、そのために何をしようとしても(expandPathscrollPathToVisible、 、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 で展開と選択したパスを記録するために使用したコードを次に示します。次のページと戻るページの間の状態をここに記録できます。

// 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、いつでも を使用して目的のEnumerationを検索できTreeNodeます。trueの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 に答える