exponenta event banner

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

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

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

  • Указание имени события в классе дескрипторов - Name Events.

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

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

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

Назвать события

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

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

События триггера

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 ® передает сообщение всем прослушивателям, определенным для этого события и исходного объекта. Существует два способа создания прослушивателей: использование класса дескрипторов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.

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

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

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

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

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

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

Определите функцию обратного вызова для принятия аргументов исходного объекта и данных события.

function callbackFunction(src,evtdata)
   ...
end

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

Определение прослушивателя

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 - дескриптор объекта, запускающего событие (то есть ToggleButton объект)

  • evtdata один 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);

Связанные темы