Реализация мероприятий и прослушивателей включает в себя следующие компоненты:
Спецификация имени события в классе 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);