我正在开发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菜单(这实际上是运行菜单)运行的动作,但我不能使它在两种情况下工作,我需要(都调用异步在注释中声明):
- 我想从项目上下文菜单中运行操作。
- 我需要在我的EsperProject运行时触发动作从主菜单项"运行主项目"。
谢谢你的建议
1。我想从项目上下文菜单运行的动作。
这将有可能通过添加@ActionReference(path = "Project/Actions", position = 0)到@ActionReferences
我已经明白了第一点:要从上下文菜单中运行操作,我们必须将其添加到项目根节点的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)