3

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を通過するすべてのものと、その醜いアクション名文字列定数を備えた最も美しいコードではないことは確かです。それは私には非常に壊れやすいようです。

では、ウィザードで生成されたアクションをノードのコンテキストメニューに取り込むための好ましい方法を知りたいのですが。それが重要な場合は、私のアクションがコンテキストアウェアであることに言及したいと思います(したがって、ルックアップで特定のインターフェイスを有効にする必要があります)。

4

1 に答える 1

2

org.openide.util.Utilities には actionsForPath(String path) というユーティリティ メソッドが存在します。これを使用して、ノードで上記のコードを次のようなものに置き換えます。

import org.openide.util.Utilities;
...
public static final String FOO_CLASS_PATH = "Actions/Tools";
...
@Override
public Action[] getActions( boolean context ) {
    List<? extends Action> actions = Utilities.actionsForPath( FOO_CLASS_PATH );
    return actions.toArray( new Action[actions.size()] );
}

これにより、ツール (この場合) に登録されたすべてのアクションが返されます。Action クラスの @ActionID または @ActionReferences アノテーションを使用して、ノード固有のアクションを特定のノードのカテゴリに配置するのが好きです。

getPreferredAction() など、特定の Action インスタンスを 1 つだけ指定するには、完全なインスタンス パスを含め、List の最初の要素のみを返します。

于 2011-12-04T16:48:18.657 に答える