NetBeans 7.0の「新規アクション」ウィザードは、ActionListener
インタフェースを実装し、いくつかの注釈を持つクラスを生成します。これらの注釈は、ウィザードで指定されたツールバー/メニューにこのアクションへの参照を配置します。このほとんどはNetBeanswikiで説明されており、期待どおりに機能します。
このようなアクションをノードのコンテキストメニューに追加したい場合に問題が発生します。そこでアクションを公開するということは、 Node.getActions(..)メソッドからアクションの具体的なインスタンスを返す必要があることを意味します。ここで欠けているのはActionListener
、いくつかの凝った注釈が付いていることですが、代わりにAction
、このリスナーによってサポートされるインスタンスが必要です。このギャップを埋めようとしたときに、Geertjanによるブログ投稿に出くわしました。これはどういうわけか関連しているようで、静的メソッドを追加しましたActionListener
。
public static Action findAction() throws Exception {
final FileObject fo = FileUtil.getConfigFile(
"Actions/Tools/foo-bar-Action.instance");
final DataObject dob = DataObject.find(fo);
final InstanceCookie ic = dob.getLookup().lookup(InstanceCookie.class);
if (ic != null) {
final Object instance = ic.instanceCreate();
if (instance instanceof Action) {
return (Action) instance;
}
}
return null;
}
これは機能しますが、ファイルシステムAPIを通過するすべてのものと、その醜いアクション名文字列定数を備えた最も美しいコードではないことは確かです。それは私には非常に壊れやすいようです。
では、ウィザードで生成されたアクションをノードのコンテキストメニューに取り込むための好ましい方法を知りたいのですが。それが重要な場合は、私のアクションがコンテキストアウェアであることに言及したいと思います(したがって、ルックアップで特定のインターフェイスを有効にする必要があります)。