Действия в модуле NetBeans - контекстное меню, главное меню - PullRequest
1 голос
/ 30 апреля 2011

Я занимаюсь разработкой модуля 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 из пункта главного меню «Запуск основного проекта».

Спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

1. Я хочу запустить действие из контекстного меню проекта.

Это будет возможно, просто добавив @ActionReference (path = "Project / Actions", position = 0) к @ ActionReferences

0 голосов
/ 01 мая 2011

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