Реализация мероприятий и прослушивателей включает в себя следующие компоненты:
Спецификация имени события в классе handle - Name Events.
Функция или метод для запуска события, когда происходит действие - Инициирование Событий.
Прослушиватель объекта для выполнения функций обратного вызова в ответ на вызванное событие - Listen to Events.
По умолчанию или пользовательские данные о событиях, которые событие передает функциям обратного вызова - Define Event-Specific Data.
Задайте событие путем объявления имени события внутри events блок. Например, этот класс создает событие с именем ToggledState:
classdef ToggleButton < handle properties State = false end events ToggledState end end
The 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 способ.
Если необходимо, чтобы прослушиватель оставался за пределами обычных возможностей переменных, используйте addlistener чтобы создать его. Источник события объекта содержит ссылку на прослушиватель объекта. Когда объект источника события уничтожается, MATLAB уничтожает прослушиватель.
Этот код определяет прослушиватель для ToggleState событие:
lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);addlistener имеет следующие аргументы:
obj - Объект, который является источником события
ToggleState - Имя события прошло как char вектор
@RespondToToggle.handleEvnt - указатель на функцию обратного вызова (см. следующее определение Define Listener).
Используйте listener метод, чтобы создать прослушиватели, когда вы хотите управлять жизненным циклом прослушивателя и не хотите связывание между источником события и объектом прослушивателя. MATLAB не уничтожает прослушиватели, созданные с помощью listener при уничтожении источника события. Однако ваш код должен держать указатель на объект слушателя в возможности при создании прослушивателей, использующих listener.
The 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 объект, описанный в, Define Event-Specific Data.
Задайте функцию обратного вызова, чтобы принять исходный объект и аргументы данных о событиях.
function callbackFunction(src,evtdata) ... end
Дополнительные сведения о синтаксисе коллбэка см. в разделе Синтаксис коллбэке прослушивателе.
The 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 - указатель на объект, вызывающий событие (то есть a 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 Класс и добавление свойства, содержащего эту информацию. Затем можно передать этот объект в 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);