イベントとリスナーの概要
イベントとリスナーの使用理由
イベントは、プロパティ値の変化やアプリケーション プログラムとユーザーのやり取りなど、起こることに応答して、オブジェクトがブロードキャストする情報です。リスナーは、対象のイベントが発生したことを通知されたときに、関数を実行します。イベントを使用して変更をオブジェクトに伝達します。リスナーはコールバック関数を実行して応答します。
詳細については、イベントとリスナーの概念を参照してください。
イベントとリスナーの基本
イベントとリスナーを使用するときは、次のようにします。
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)のメソッドの場合。Objaddlistener(SourceOfEvent,'—EventName',@ClassName.methodName)クラスの静的メソッドの場合。ClassName
ListenerObject = addlistener(SourceOfEvent,'EventName',@listenerCallback);
addlistener はリスナー オブジェクトを返します。入力引数は以下のとおりです。
— イベントを定義するクラスのオブジェクト。イベントはこのオブジェクトでトリガーされます。SourceOfEvent— クラスのEventNameeventsコード ブロックで定義されたイベントの名前。@— イベントに応答して実行される関数を参照する関数ハンドル。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
詳細については、リスナー コールバックの構文を参照してください。