0

カスタム オブジェクトとカスタム モデルを含む JTree があります。ある時点でノードを選択し、それが発生したら、新しく取得したデータでツリーを更新します。それが発生したら、ツリーをたどって選択したノードを見つけ、それを新しいノード (最新のもの) に置き換えます。見つかったら、古いノードを親から削除し、その位置に新しいノードを追加して、nodeChanged(newNode) を呼び出します。ツリーは正常に更新され、更新されたコンテンツとともに新しいノードがそこに表示されます。

問題は、このツリーの更新から戻るときに、選択パスが更新されていないことです。そのため、メソッド getSelectionPaths() を使用すると、返されるパス (ノードが 1 つだけ選択されている場合) は、ツリーから削除した古いノードに対応します。 .

新しく更新されたモデルへの選択パスを更新するにはどうすればよいですか?

4

2 に答える 2

3

新しい TreePath を作成し、新しいパスで setSelectedPath を呼び出すことができます。ただし、ノードを削除する代わりに、ノードを変更可能にしてノードを更新する方が良いでしょう。この方法では、ツリー モデルは変更されず、選択パスも変更されません。

また、適切なイベントを発生させる必要があります (ノードの削除/追加などではなく、ノードの変更)。

于 2012-06-05T20:11:00.430 に答える
0

葉の新しいパスを見つけることができれば、TreePathを作成できます。

1 レベルの node を持つ JTree でリーフを選択する例を作成しました。

public JTree             fileTree;
public void setJTreePath(String leafName, String nodeName) {

    TreeNode root = (TreeNode) fileTree.getModel().getRoot();
    TreePath path = new TreePath(root);
    int rootChildCount = root.getChildCount();
    mainLoop:
    for (int i = 0; i < rootChildCount; i++) {

        TreeNode child = root.getChildAt(i);
        if (child.toString().equals(nodeName)) {
            path = path.pathByAddingChild(child);
            int ChildCount = child.getChildCount();
            for (int j = 0; j < ChildCount; j++) {
                TreeNode child2 = child.getChildAt(j);
                if (child2.toString().equals(leafName)) {
                    path = path.pathByAddingChild(child2);
                    fileTree.setSelectionPath(path);

                    //I've used a SwingUtilities here, maybe it's not mandatory
                    SwingUtilities.invokeLater(
                            new Runnable() {
                                @Override
                                public void run() {
                                    fileTree.scrollPathToVisible(fileTree.getSelectionPath());
                                }
                            });
                    break mainLoop;
                }
            }
        }
    }
}
于 2012-06-05T20:35:37.577 に答える