2

我正在开发 NetBeans 模块,并且我已经声明了一个操作(使用注释,它们被转换为 layer.xml 记录),它适用于我的自定义项目类型(EsperProject 类):

@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 菜单(实际上是“运行”菜单)运行该操作,但我无法使其在我需要的两种情况下工作(两者都按照注释中的声明异步调用):

  1. 我想从项目上下文菜单中运行该操作。
  2. 当我的 EsperProject 从主菜单项“运行主项目”运行时,我需要触发该操作。

感谢您的任何建议。

4

2 回答 2

1

1.我想从项目上下文菜单中运行操作。

只需将 @ActionReference(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 回答