Я понял первый пункт: чтобы запустить действие из контекстного меню, мы должны добавить его в метод 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)