Переопределение метода actionPerform в собственном action'e

Добрый день.
В контроллере экрана (ListView) у меня есть подписка на действие startAgent:

    @Subscribe("agentsDataGrid.startAgent")
    public void onAgentsDataGridStartAgent(final ActionPerformedEvent event) {
        Agent selectedAgent = agentsDataGrid.getSingleSelectedItem();
        if (selectedAgent != null) {
            agentService.startAgent(selectedAgent.getId());
            agentsDl.load();
            showNotification(messages.getMessage("ru.ctsg.damdbf.manager.view.agent/startAgent"));
        }
    }

Сейчас пытаюсь перенести логику из данного метода в метод actionPerform в action, но пока безуспешно. Не понимаю, где допускаю ошибку. Пока получил следующее, но это не работает. При нажатии кнопки в UI ничего не происходит:

@ActionType(StartAgentAction.ID)
public class StartAgentAction<E> extends ItemTrackingAction<E> {

    public static final String ID = "startAgent";

    @Autowired
    private AgentService agentService;

    @Autowired
    private Notifications notifications;

    @Autowired
    private Messages messages;

    public StartAgentAction(String id) {
        super(id);
    }

    @Override
    public void actionPerform(Component component) {
        if (getTarget() != null) {
            E selected = getTarget().getSingleSelectedItem();
            if (selected != null) {
                notifications.create(messages.getMessage("ru.ctsg.damdbf.manager.view.agent/stopAgent"))
                        .withType(Notifications.Type.SUCCESS)
                        .withPosition(Notification.Position.MIDDLE)
                        .show();
            }
        }
    }
}

У меня следующие вопросы:

  1. От какого класса лучше экстендить свое действие: от ItemTrackingAction (на примере, как в документации Собственные типы действий :: Документация Jmix) или можно от BaseAction?
  2. Чтобы все заработало, мне нужно в подписке на кнопку вызвать свое действие и у него вызвать actionPerform? То есть сделать примерно следующее?
    @Subscribe(id = "startAgentBtn", subject = "clickListener")
    public void onStartAgentBtnClick(final ClickEvent<JmixButton> event) {
        agentsDataGridStartAgent.actionPerform(agentsDataGrid);
        agentsDl.load();
    }

Добрый день!

Если наследуете действие от ItemTrackingAction, то оно автоматически будет становится активным только когда в связанном dataGrid выбран какой-то элемент. Возможно в этом проблема того, что “в UI ничего не происходит”.

Использование действия в экране должно быть примерно такое:

<hbox id="buttonsPanel" classNames="buttons-panel">
    <button action="usersDataGrid.startAgent"/>
</hbox>
<dataGrid id="usersDataGrid" dataContainer="usersDc">
    <actions>
        <action id="startAgent" type="startAgent" text="Start agent"/>

Здесь кнопка декларативно привязывается к действию. Она получает его свойства (в данном случае text и enabled), и вызывает при нажатии его actionPerform. В подписке на кнопку вызывать ничего не нужно.

Константин, спасибо за ответ! А type для action обязательно указывать? Если указываю, то в контроллере экрана не могу подписаться на действие startAgent.

Либо Вы используете action и его actionPerform из описанного класса (указывая type), либо, не указывая type, во вью пришете свой обработчик actionPerfom