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

Компоненты, чтобы реализовать

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

Именование Событий

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

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

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

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

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

addlistener имеет эти аргументы:

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

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

  • @RespondToToggle.handleEvnt — Указатель на функцию к функции обратного вызова (см., что следующее определение Задает Прослушиватель).

Использование handle.listener, чтобы Разъединить Прослушиватель и Источник

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

Метод handle.listener требует тех же аргументов как handle.addlistener addlistener: называющий событие объект, имя события и указатель на функцию к обратному вызову. handle.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)

  • evtdataevent.EventData Объект 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 и добавления свойства содержать эту информацию. Затем можно передать этот объект методу handle.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);

Похожие темы

Была ли эта тема полезной?