Main Content

イベントとリスナーの概要

イベントとリスナーの使用理由

イベントは、プロパティ値の変化やアプリケーション プログラムとユーザーのやり取りなど、起こることに応答して、オブジェクトがブロードキャストする情報です。リスナーは、対象のイベントが発生したことを通知されたときに、関数を実行します。イベントを使用して変更をオブジェクトに伝達します。リスナーはコールバック関数を実行して応答します。

詳細については、イベントとリスナーの概念を参照してください。

イベントとリスナーの基本

イベントとリスナーを使用するときは、次のようにします。

  • 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

詳細については、リスナー コールバックの構文を参照してください。

参考

|

関連するトピック