2

NetBeansモジュールを開発していて、カスタムプロジェクトタイプ(EsperProjectクラス)で機能するアクション(アノテーションを使用して、layer.xmlレコードに変換されます)を宣言しました。

@ActionID(category = "Run", id = "my.package.RunEsperAction")
@ActionRegistration(displayName = "My Action", asynchronous=true)
@ActionReferences({
    @ActionReference(path = "Menu/BuildProject", position = 0)
})
public final class RunEsperAction implements ActionListener {

    private final EsperProject project;

    public RunEsperAction(EsperProject project) {
        this.project = project;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
       // do sth with project
    }
}

BuildProjectメニュー(実際には[実行]メニュー)からアクションを実行できますが、必要な2つの場合(両方ともアノテーションで宣言されているように非同期で呼び出されます)で動作させることはできません。

  1. プロジェクトのコンテキストメニューからアクションを実行したいと思います。
  2. メインメニュー項目「メインプロジェクトの実行」からEsperProjectを実行するときに、アクションをトリガーする必要があります。

提案をありがとう。

4

2 に答える 2

1

1.プロジェクトのコンテキストメニューからアクションを実行したい。

@ActionReferences(path = "Project / Actions"、position = 0)を@ActionReferencesに追加するだけで可能になります

于 2011-12-01T14:21:39.893 に答える
0

最初のポイントを理解しました。コンテキストメニューからアクションを実行するには、次のように、プロジェクトルートノードのgetActions()メソッドにアクションを追加する必要があります。

class RootNode extends FilterNode {
    @Override
    public Action[] getActions(boolean arg0) {
        List<Action> nodeActions = new ArrayList<Action>();
        nodeActions.addAll(Utilities.actionsForPath("Actions/MyCategoryInLayer"));
        return nodeActions.toArray(new Action[nodeActions.size()]);
    }
}

アクションはプロジェクトのコンテキストメニューに表示され、非同期で実行されます。ただし、「メインプロジェクトの実行」をオーバーライドすることはまだ不可能です。私は同様のアプローチを試みましたが、これは失敗します:

@Override
public void invokeAction(String actionName, Lookup lookup) throws IllegalArgumentException {

if (actionName.equalsIgnoreCase(ActionProvider.COMMAND_RUN)) {
    List<? extends Action> runActions = Utilities.actionsForPath("Actions/Run");
        for (Action action : runActions) {
            action.actionPerformed(null);
        }
}

java.lang.NullPointerException at org.openide.util.actions.ActionInvoker$ActionRunnable.needsToBeSynchronous(ActionInvoker.java:147)
于 2011-04-30T23:30:29.200 に答える