Реализация событий и прослушивателей включает эти компоненты:
Спецификация имени события в классе 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
.
Если вы хотите, чтобы прослушиватель сохранился вне нормальной переменной scope, используйте 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
: называющий событие объект, имя события и указатель на функцию к коллбэку. 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
— 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
и добавления свойства содержать эту информацию. Затем можно передать этот объект методу 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);