4.5.4. Действия. Интерфейс Action

Action − интерфейс, абстрагирующий действие (другими словами, некоторую функцию) от визуального компонента. Он особенно полезен в случаях, когда одно и то же действие может быть вызвано из разных визуальных компонентов. Кроме того, данный интерфейс позволяет снабдить действие дополнительными свойствами, такими как название, признаки доступности и видимости, и другими.

Рассмотрим методы интерфейса Action:

  • actionPerform() - вызывается визуальным компонентом, связанным с данным действием. В метод передается экземпляр вызвавшего компонента.

  • getId() - возвращает идентификатор данного действия. Идентификатор обычно устанавливается конструктором класса, реализующего Action, и не меняется на протяжении жизни созданного объекта действия.

  • методы получения и установки свойств caption, description, shortcut, icon, enabled, visible. Все эти свойства обычно используется связанными визуальными компонентами для установки собственных одноименных свойств.

  • addPropertyChangeListener(), removePropertyChangeListener() - подключение слушателей, реагирующих на изменение вышеупомянутых свойств. Слушатель получает уведомление типа java.beans.PropertyChangeEvent, в котором содержится имя измененного свойства, его старое и новое значение.

  • refreshState() - метод, который может быть реализован в конкретном классе действия для инициализации вышеупомянутых свойств в соответствии с какими-либо внешними факторами, например правами пользователя. Вызывается обычно в конструкторах имплементирующих классов или из связанных визуальных компонентов.

  • addOwner(), removeOwner(), getOwner(), getOwners() - методы для управления связью действия с визуальными компонентами.

Для реализации действий рекомендуется использовать декларативное создание действий, либо наследоваться от класса AbstractAction. Кроме того, существует набор стандартных действий, применимых для работы с таблицами и компонентами выбора. От стандартных действий также можно наследоваться для модификации их поведения или перехвата событий.

Визуальные компоненты, связанные с действием, могут быть двух типов:

  • Визуальный компонент, содержащий одно действие, реализует интерфейс Component.ActionOwner. Это Button и LinkButton.

    Связь компонента с действием осуществляется путем вызова метода ActionOwner.setAction() компонента. В этот момент компонент заменяет свои свойства на соответствующие свойства действия (подробнее см. описание компонентов).

  • Визуальный компонент, содержащий несколько действий, реализует интерфейс Component.ActionsHolder. Это Window, Frame, Table и ее наследники, Tree, PopupButton, PickerField, LookupPickerField.

    Действия добавляются компоненту вызовом метода ActionsHolder.addAction(). Реализация этого метода в компоненте проверяет, нет ли уже в нем действия с таким же идентификатором. Если есть, то имеющееся действие будет заменено на новое переданное. Поэтому можно, например, декларировать стандартное действие в дескрипторе экрана, а затем в контроллере создать новое с переопределенными методами и добавить компоненту.