0

いくつかのノードを表示する BeanTreeView があります。そして、現時点でツリーに何があるかを知る必要がある、netbeans に関連しない別のコンポーネントがあります。できれば、ツリー内のノードの単純なリストです。(明確化。ここでノードについて話すときは、JTree の TreeNodes ではなく、netbeans ノードを意味します。)

これを行うための便利な方法は見つかりませんでした。BeanTreeView に接続されている関連する ExplorerManager から情報を取得できないようです。これまでのところ、BeanTreeView をサブクラス化し、プライベート メソッドを追加しました。

private List<Object> getNodesAsList(){
    LinkedList<Object> result = new LinkedList<>();
    for (int i = 0; i < tree.getRowCount(); i++) {
        TreePath pathForRow = tree.getPathForRow(i);
        Object lastPathComponent = pathForRow.getLastPathComponent();
        result.add(lastPathComponent);
    }
    return result;
}

getLastPathComponent から取得したオブジェクトは、取得したいノードを保持する VisualizerNode です。しかし、org.openide.explorer.view で公開されていないため、VisualizerNode にキャストできません。そして最終です。とにかく、ノードのゲッターはありません...

何か案は?ExplorerManager で何か見逃しているような気がします...

アップデート; これは私にとってはうまくいきました。おそらくもっとエレガントにできるでしょう。ありがとう水田!

private List<Node> getNodesInTree(){
    LinkedList<Node> result = new LinkedList<>();
    ExplorerManager em = ExplorerManager.find(this);
    for (Node node : em.getRootContext().getChildren().getNodes()) {
        result.add(node);
        result.addAll(getChildNodesInTree(node));
    }
    return result;
}

private List<Node> getChildNodesInTree(Node root){
    LinkedList<Node> result = new LinkedList<>();
    if(root.getChildren().getNodesCount() > 0){
        if(isExpanded(root)){
            for (Node node : root.getChildren().getNodes()) {
                result.add(node);
                result.addAll(getChildNodesInTree(node));
            }
        }
    }
    return result;
}
4

1 に答える 1