Main Content

事件和侦听程序概述

为什么使用事件和侦听程序

事件是对象响应发生的事情而广播的通知,例如属性值更改或用户与应用程序的交互。侦听程序在通知关注的事件发生时执行函数。使用事件来通告对对象的更改。侦听程序通过执行回调函数来响应。

有关详细信息,请参阅事件和侦听程序概念

事件和侦听程序基础知识

在使用事件和侦听程序时:

  • 只有 handle 类可以定义事件和侦听程序。

  • 在类定义的 events 代码块中定义事件名称(事件和侦听程序语法)。

  • 使用事件属性指定对事件的访问权限(Event Attributes)。

  • 调用句柄的 notify 方法触发事件。事件通知将指定事件广播给为此事件注册的所有侦听程序。

  • 使用句柄的 addlistener 方法将侦听程序耦合到事件源对象。MATLAB® 会在销毁事件的源时同时销毁侦听程序。

  • 使用句柄的 listener 方法可创建与事件源对象的生命周期不耦合的侦听程序。如果您在能够独立添加、删除或修改的不同组件中定义事件源和侦听程序,这种方式非常有用。您的应用程序代码控制侦听程序对象的生命周期。

  • 侦听程序回调函数必须定义至少两个输入参量 - 事件源对象句柄和事件数据(有关详细信息,请参阅Listener Callback Syntax)。

  • 通过子类化 event.EventData 类修改传递给每个侦听程序回调的数据。

预定义的事件

MATLAB 定义事件用于侦听属性集和查询。有关详细信息,请参阅侦听对属性值的更改

所有句柄对象都定义名为 ObjectBeingDestroyed 的事件。MATLAB 在调用类析构函数之前触发此事件。

事件语法

events 代码块中定义事件名称:

classdef ClassName < handle
   events
      EventName
   end
end

例如,MyClass 定义名为 StateChange 的事件:

classdef MyClass < handle
   events
      StateChange
   end
end

使用 handle 类的 notify 方法触发事件:

classdef ClassName < handle
   events
      EventName
   end

   methods
      function anyMethod(obj)
         notify(obj,'EventName');
      end
   end
end

任何函数或方法都可以为定义事件的类的特定实例触发事件。例如,triggerEvent 方法调用 notify 来触发 StateChange 事件:

classdef MyClass < handle
   events
      StateChange
   end
   methods
      function triggerEvent(obj)
         notify(obj,'StateChange')
      end
   end
end

triggerEvent 方法触发 StateChange 事件:

obj = MyClass;
obj.triggerEvent

有关详细信息,请参阅事件和侦听程序语法

创建侦听程序

使用 handleaddlistenerlistener 方法定义侦听程序。使用以下语法之一传递侦听程序回调函数的函数句柄:

  • addlistener(SourceOfEvent,'EventName',@functionName) - 针对普通函数。

  • addlistener(SourceOfEvent,'EventName',@Obj.methodName) - 针对 Obj 的方法。

  • addlistener(SourceOfEvent,'EventName',@ClassName.methodName) - 针对类 ClassName 的静态方法。

ListenerObject = addlistener(SourceOfEvent,'EventName',@listenerCallback);

addlistener 返回侦听程序对象。输入参量为:

  • SourceOfEvent - 定义事件的类的对象。事件在此对象上触发。

  • EventName - events 类代码块中定义的事件名称。

  • @listenerCallback - 引用响应事件而执行的函数的函数句柄。

例如,为 StateChange 事件创建侦听程序对象:

function lh = createListener(src)
   lh = addlistener(src,'StateChange',@handleStateChange)
end

为侦听程序定义回调函数。回调函数必须接受事件源对象和事件数据对象作为前两个参量:使用事件源参量访问触发事件的对象。使用事件数据对象查找有关事件的信息。

function handleStateChange(src,eventData)
   % src - handle to object that triggered the event
   % eventData - event.EventData object containing 
   %             information about the event.   
   ...
end

有关详细信息,请参阅Listener Callback Syntax

另请参阅

|

相关主题