イベントとリスナーの概要
イベントとリスナーの使用理由
イベントは、プロパティ値の変化やアプリケーション プログラムとユーザーのやり取りなど、起こることに応答して、オブジェクトがブロードキャストする情報です。リスナーは、対象のイベントが発生したことを通知されたときに、関数を実行します。イベントを使用して変更をオブジェクトに伝達します。リスナーはコールバック関数を実行して応答します。
詳細については、イベントとリスナーの概念を参照してください。
イベントとリスナーの基本
イベントとリスナーを使用するときは、次のようにします。
handle
クラスのみが、イベントとリスナーを定義できます。クラス定義の
events
ブロックでイベント名を定義します (イベントとリスナーの構文)。イベントの属性を使用してイベントへのアクセスを指定します (イベントの属性)。
ハンドルの
notify
メソッドを呼び出してイベントをトリガーします。イベントの通知では、このイベントに対して登録されたすべてのリスナーに、名前の付いたイベントを送信します。ハンドルの
addlistener
メソッドを使用して、リスナーをイベント ソース オブジェクトに結合します。イベントのソースが破棄されると、MATLAB® はリスナーを破棄します。ハンドルの
listener
メソッドを使用して、イベント ソース オブジェクトのライフサイクルに結合されていないリスナーを作成します。この方法は、イベント ソースとリスナーが異なるコンポーネントで定義されていて、それぞれを別々に追加、削除または変更できるようにする場合に役に立ちます。アプリケーション コードはリスナー オブジェクトのライフサイクルを制御します。リスナー コールバック関数は、少なくとも 2 つの入力引数、すなわちイベント ソースであるオブジェクトのハンドルとイベント データとを定義しなければなりません (詳細については、リスナー コールバックの構文を参照)。
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
詳細については、イベントとリスナーの構文を参照してください。
リスナーの作成
handle
クラスの addlistener
メソッドまたは listener
メソッドを使用して、リスナーを定義します。以下の構文のいずれかを使用して、リスナー コールバック関数の関数ハンドルを渡します。
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
リスナーに対しコールバック関数を定義します。コールバック関数は、最初の 2 つの引数としてイベント ソース オブジェクトとイベント データ オブジェクトを受け取らなければなりません。イベント ソース引数を使用して、イベントをトリガーしたオブジェクトにアクセスします。イベント データ オブジェクトを使用して、イベントに関する情報を検索します。
function handleStateChange(src,eventData) % src - handle to object that triggered the event % eventData - event.EventData object containing % information about the event. ... end
詳細については、リスナー コールバックの構文を参照してください。