Реализация событий и слушателей включает в себя следующие компоненты:
Указание имени события в классе дескрипторов - 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 для его создания. Объект источника события содержит ссылку на объект прослушивателя. При уничтожении объекта-источника события MATLAB уничтожает прослушиватель.
Этот код определяет прослушиватель для ToggleState событие:
lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);addlistener имеет следующие аргументы:
obj - объект, являющийся источником события;
ToggleState - Имя события передано как char вектор
@RespondToToggle.handleEvnt - дескриптор функции обратного вызова (см. следующее определение Define Listener).
Используйте listener метод создания прослушивателей, когда требуется управлять жизненным циклом прослушивателя и не требуется связь между источником события и объектом прослушивателя. MATLAB не уничтожает прослушиватели, созданные с помощью listener при уничтожении источника события. Однако код должен сохранять дескриптор объекта прослушивателя в области при создании прослушивателей с помощью listener.
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 объект, описанный в разделе Определение специфичных для события данных.
Определите функцию обратного вызова для принятия аргументов исходного объекта и данных события.
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);