APIorg.openide.nodes.ChildFactory
のいずれかを使用する特別な必要がない限り、子ノードの作成に使用することをお勧めします。Children
しかし、一般的なケースでChildFactory
は、それで十分です。
Nodes APIを使用する際に留意すべきことの1つは、モデルをラップするのはプレゼンテーション層のみであり、Explorer APIと組み合わせて使用すると、などのNetBeansプラットフォームのさまざまなビューコンポーネントで使用できるようになることですorg.openide.explorer.view.BeanTreeView
。
MyModel
次のようなモデルを使用します。
public class MyModel {
private String title;
private List<MyChild> children;
public MyModel(List<MyChild> children) {
this.children = children;
}
public String getTitle() {
return title;
}
public List<MyChild> getChildren() {
return Collections.unmodifiableList(children);
}
}
ChildFactory<MyModel>
ノードの作成を担当するを作成できます。
public class MyChildFactory extends ChildFactory<MyModel> {
private List<MyModel> myModels;
public MyChildFactory(List<MyModel> myModels) {
this.myModels = myModels;
}
protected boolean createKeys(List<MyModel> toPopulate) {
return toPopulate.addAll(myModels);
}
protected Node createNodeForKey(MyModel myModel) {
return new MyNode(myModel);
}
protected void removeNotify() {
this.myModels= null;
}
}
MyNode
次に、プレゼンテーション層とラップである実装MyModel
:
public class MyNode extends AbstractNode {
public MyNode(MyModel myModel) {
this(myModel, new InstanceContent());
}
private MyNode(MyModel myModel, InstanceContent content) {
super(Children.create(
new MyChildrenChildFactory(myModel.getChildren()), true),
new AbstractLookup(content)); // add a Lookup
// add myModel to the lookup so you can retrieve it latter
content.add(myModel);
// set the name used in the presentation
setName(myModel.getTitle());
// set the icon used in the presentation
setIconBaseWithExtension("com/my/resouces/icon.png");
}
}
そして今、これは、それがaを取り、次に作成することを除いて、MyChildrenChildFactory
非常に似ています:MyChildFactory
List<MyChild>
MyChildNode
public class MyChildFactory extends ChildFactory<MyChild> {
private List<MyChild> myChildren;
public MyChildFactory(List<MyChild> myChildren) {
this.myChildren = myChildren;
}
protected boolean createKeys(List<MyChild> toPopulate) {
return toPopulate.addAll(myChildren);
}
protected Node createNodeForKey(MyChild myChild) {
return new MyChildNode(myChild);
}
protected void removeNotify() {
this.myChildren = null;
}
}
次に、その実装は次のMyChildNode
ようになりMyNode
ます。
public class MyChildNode extends AbstractNode {
public MyChildNode(MyChild myChild) {
// no children and another way to add a Lookup
super(Children.LEAF, Lookups.singleton(myChild));
// set the name used in the presentation
setName(myChild.getTitle());
// set the icon used in the presentation
setIconBaseWithExtension("com/my/resouces/child_icon.png");
}
}
そして、次のような子供用モデルが必要になりMyChild
ますMyModel
。
public class MyChild {
private String title;
public String getTitle() {
return title;
}
}
最後に、すべてを使用するために、たとえば、を実装BeanTreeView
するに存在するaを使用します。TopComponent
org.openide.explorer.ExplorerManager.Provider
// somewhere in your TopComponent's initialization code:
List<MyModel> myModels = ...
// defined as a property in you TC
explorerManager = new ExplorerManager();
// this is the important bit and we're using true
// to tell it to create the children asynchronously
Children children = Children.create(new MyChildFactory(myModels), true);
explorerManager.setRootContext(new AbstractNode(children));
に触れる必要はなくBeanTreeView
、実際には、プラットフォームに含まれている任意のビューコンポーネントである可能性があることに注意してください。これはノードを作成するための推奨される方法であり、私が述べたように、ノードの使用は、プラットフォームに含まれるさまざまなコンポーネントで使用されるプレゼンテーション層として使用されます。
次に子を取得する必要がある場合は、実装されたメソッドを使用してExplorerManager
取得できる子を使用できます。これは、実装されており、実際にはビューコンポーネント自体がノードを取得する方法です。TopComponent
ExplorerManager.Provier.getExplorerManager()
TopComponent
ExplorerManager.Provider
ExplorerManager explorerManager = ...
// the AbstractNode from above
Node rootContext = explorerManager.getRootContext();
// the MyNode(s) from above
Children children = rootContext.getChildren().getNodes(true);
// looking up the MyModel that we added to the lookup in the MyNode
MyModel myModel = nodes[0].getLookup().lookup(MyModel.class);
Children.getNodes(true)
ただし、このメソッドを使用してノードを取得すると、すべてのノードとその子が作成されることに注意する必要があります。これは、子を非同期で作成するようにファクトリに指示したために作成されませんでした。これはデータにアクセスするための推奨される方法ではありませんが、代わりにへの参照を保持し、List<MyModel>
可能であればそれを使用する必要があります。のドキュメントからChildren.getNodes(boolean)
:
...一般に、このメソッドを呼び出して有用なデータを取得しようとしている場合は、おそらく何か間違ったことをしています。通常、子のノードではなく、基礎となるモデルに情報を要求する必要があります。
繰り返しになりますが、Nodes APIはプレゼンテーション層であり、モデルとビューの間のアダプターとして使用されることを覚えておく必要があります。
これが強力なテクニックになるのはChildFactory
、異なるさまざまなビューで同じものを使用する場合です。上記のコードは、TopComponents
変更を加えることなく多くの場合に再利用できます。FilterNode
元のノードに触れることなく、ノードの表示の一部のみを変更する必要がある場合にも、を使用できます。
Nodes APIの学習は、間違いなく発見したように、NetBeansプラットフォームAPIを学習する上で最も難しい側面の1つです。このAPIをある程度習得すると、組み込みの機能をさらに活用できるようになります。
Nodes APIの詳細については、次のリソースを参照してください。