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