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