いくつかのノードを表示する 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;
}