Синтаксис событий и прослушивателей

Компоненты для реализации

Реализация мероприятий и прослушивателей включает в себя следующие компоненты:

  • Спецификация имени события в классе handle - Name Events.

  • Функция или метод для запуска события, когда происходит действие - Инициирование Событий.

  • Прослушиватель объекта для выполнения функций обратного вызова в ответ на вызванное событие - Listen to Events.

  • По умолчанию или пользовательские данные о событиях, которые событие передает функциям обратного вызова - Define Event-Specific Data.

Назовите События

Задайте событие путем объявления имени события внутри events блок. Например, этот класс создает событие с именем ToggledState:

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggledState
   end
end

Инициирование событий

The OnStateChange вызовы методов notify чтобы вызвать ToggledState событие. Передайте указатель на объект, который является источником события, и имя события в notify.

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggledState
   end
   methods
      function OnStateChange(obj,newState)
         if newState ~= obj.State
            obj.State = newState;
            notify(obj,'ToggledState');
         end
      end
   end
end

Слушать события

После вызова к notify запускает событие, MATLAB® передает сообщение всем прослушивателям, которые определены для этого события и исходного объекта. Существует два способа создания прослушивателей: использование класса handle addlistener или listener способ.

Используйте addlistener для постоянных прослушивателей

Если необходимо, чтобы прослушиватель оставался за пределами обычных возможностей переменных, используйте addlistener чтобы создать его. Источник события объекта содержит ссылку на прослушиватель объекта. Когда объект источника события уничтожается, MATLAB уничтожает прослушиватель.

Этот код определяет прослушиватель для ToggleState событие:

lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);

addlistener имеет следующие аргументы:

  • obj - Объект, который является источником события

  • ToggleState - Имя события прошло как char вектор

  • @RespondToToggle.handleEvnt - указатель на функцию обратного вызова (см. следующее определение Define Listener).

Используйте handle.listener для декуплирования прослушивателя и источника

Используйте listener метод, чтобы создать прослушиватели, когда вы хотите управлять жизненным циклом прослушивателя и не хотите связывание между источником события и объектом прослушивателя. MATLAB не уничтожает прослушиватели, созданные с помощью listener при уничтожении источника события. Однако ваш код должен держать указатель на объект слушателя в возможности при создании прослушивателей, использующих listener.

The listener метод требует тех же аргументов, что и addlistener: объект именования событий, имя события и указатель на функцию для коллбэка. listener возвращает указатель на объект прослушивателя.

lh = listener(obj,'EventName',@callbackFunction)

Для примера этот код использует ToggleState событие, обсуждавшееся ранее:

lh = listener(obj,'ToggleState',@RespondToToggle.handleEvnt)

Функция обратного вызова

Функция обратного вызова прослушивателя должна принимать минимум два аргумента, которые MATLAB автоматически передает коллбэк. Вот необходимые аргументы:

  • Источник события - то есть obj в вызове addlistener или event.listener.

  • Система координат event.EventData объект или подкласс event.EventData, таких как ToggleEventData объект, описанный в, Define Event-Specific Data.

Задайте функцию обратного вызова, чтобы принять исходный объект и аргументы данных о событиях.

function callbackFunction(src,evtdata)
   ...
end

Дополнительные сведения о синтаксисе коллбэка см. в разделе Синтаксис коллбэке прослушивателе.

Задайте прослушиватель

The RespondToToggle класс задает объекты, которые слушают ToggleState событие, заданное в ToggleButton класс.

classdef RespondToToggle < handle
   methods
      function obj = RespondToToggle(toggle_button_obj)
         addlistener(toggle_button_obj,'ToggledState',@RespondToToggle.handleEvnt);
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggledState is true')
         else
            disp('ToggledState is false')
         end
      end
   end
end

Класс RespondToToggle добавляет прослушиватель в его конструктор. В этом случае класс задает коллбэк (handleEvnt) как статический метод, который принимает два обязательных аргумента:

  • src - указатель на объект, вызывающий событие (то есть a ToggleButton объект)

  • evtdata - An event.EventData объект

Например, этот код создает объекты обоих классов:

tb = ToggleButton;
rtt = RespondToToggle(tb);

Всякий раз, когда вы вызываете OnStateChange метод ToggleButton объект, notify инициирует событие. В данном примере в коллбэке отображается значение State свойство:

tb.OnStateChange(true)
ToggledState is true
tb.OnStateChange(false)
ToggledState is false

Удаление прослушивателей

Удалите объект прослушивателя, вызвав delete на его указателе. Для примера, если класс RespondToToggle сохранен указатель на прослушиватель как свойство, можно удалить прослушиватель.

classdef RespondToToggle < handle
   properties
      ListenerHandle % Property for listener handle
   end
   methods
      function obj = RespondToToggle(toggle_button_obj)
         hl = addlistener(toggle_button_obj,'ToggledState',@RespondToToggle.handleEvnt);
         obj.ListenerHandle = hl; % Save listener handle
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggledState is true')
         else
            disp('ToggledState is false')
         end
      end
   end
end

С этим изменением кода можно удалить прослушиватель из образца RespondToToggle класс. Для примера:

tb = ToggleButton;
rtt = RespondToToggle(tb); 

Объект rtt слушает ToggleState событие, инициируемое объектом tb. Чтобы удалить прослушиватель, вызовите delete в свойстве, содержащем указатель на прослушиватель.

delete(rtt.ListenerHandle)

Чтобы временно отключить прослушиватель, смотрите раздел Временная деактивация прослушивателей.

Определите данные для конкретного события

Предположим, что вы хотите передать состояние кнопки-переключателя в результате события в прослушивателе коллбэка. Вы можете добавить дополнительные данные к данным о событиях по умолчанию, подклассифицировав event.EventData Класс и добавление свойства, содержащего эту информацию. Затем можно передать этот объект в notify способ.

Примечание

Сохранение и загрузка объектов, являющихся подклассами event.EventData, таких как ToggleEventData, включите ConstructOnLoad атрибут класса для подкласса.

classdef (ConstructOnLoad) ToggleEventData < event.EventData
   properties
      NewState
   end
   
   methods
      function data = ToggleEventData(newState)
         data.NewState = newState;
      end
   end
end

Вызов notify может использовать ToggleEventData конструктор, чтобы создать необходимый аргумент.

evtdata = ToggleEventData(newState);
notify(obj,'ToggledState',evtdata);

Похожие темы