Main Content

イベントとリスナーの構文

実装するコンポーネント

イベントとリスナーの実装には、以下のコンポーネントが含まれます。

イベントの命名

イベントを定義するには、events ブロック内 でイベント名を宣言します。たとえば、このクラスは ToggleState というイベントを作成します。

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggleState
   end
end

イベントには、自身を定義するクラスと同じ名前を付けることはできません。

イベントのトリガー

OnStateChange メソッドは notify を呼び出して ToggleState イベントをトリガーします。イベントのソースであるオブジェクトのハンドルとイベント名を notify に渡します。

classdef ToggleButton < handle
   properties
      State = false
   end
   events
      ToggleState
   end
   methods
      function OnStateChange(obj,newState)
         if newState ~= obj.State
            obj.State = newState;
            notify(obj,'ToggleState');
         end
      end
   end
end

イベントのリスニング

notify の呼び出しがイベントをトリガーすると、MATLAB® は、そのイベントとソース オブジェクトに定義されているすべてのリスナーにメッセージをブロードキャストします。リスナーを作成する方法には、ハンドル クラス addlistener の使用と listener メソッドの使用の 2 つがあります。

永続リスナーに対する addlistener の使用

通常の変数スコープを超えてリスナーを存続させる場合、addlistener を使用して作成します。イベント ソース オブジェクトは、リスナー オブジェクトへの参照を保持します。イベント ソース オブジェクトが破棄されると、MATLAB はリスナーを破棄します。

次のコードは、ToggleState イベントに対してリスナーを定義します。

lh = addlistener(obj,'ToggleState',@RespondToToggle.handleEvnt);

addlistener は、次の引数を取ります。

  • obj — イベントのソースであるオブジェクト

  • ToggleStatechar ベクトルとして渡されるイベント名

  • @RespondToToggle.handleEvnt — コールバック関数の関数ハンドル (リスナーの定義に記載された定義を参照)。

handle.listener を使用したリスナーとソースの分離

リスナーのライフサイクルを管理する必要があり、イベント ソースとリスナー オブジェクト間を結合する必要がない場合に、listener メソッドを使用してリスナーを作成します。MATLAB は、イベント ソースが破棄されたときに、listener を使用して作成されたリスナーを破棄しません。ただし、listener を使用してリスナーを作成するときに、コードはリスナー オブジェクトのハンドルをスコープ内に保持しなければなりません。

listener メソッドは、addlistener と同じ引数を必要とします。つまり、引数は、イベントに名前を付けるオブジェクト、イベントの名前、コールバックの関数ハンドルです。listener はリスナー オブジェクトのハンドルを返します。

lh = listener(obj,'EventName',@callbackFunction)

たとえば、次のコードは前述の ToggleState イベントを使用します。

lh = listener(obj,'ToggleState',@RespondToToggle.handleEvnt)

コールバック関数

リスナー コールバック関数は、少なくとも 2 つの引数を受け入れなければなりません。これを MATLAB が自動的にコールバックに渡します。以下は必須の引数です。

  • イベントのソース — つまり、addlistener または event.listener の呼び出しにおける obj

  • event.EventData オブジェクト、またはイベント特有のデータの定義で説明した ToggleEventData オブジェクトなど event.EventData のサブクラス。

ソース オブジェクトとイベント データ引数を受け入れるようにコールバック関数を定義します。

function callbackFunction(src,evtdata)
   ...
end

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

リスナーの定義

RespondToToggle クラスは、ToggleButton クラスで定義されている ToggleState イベントをリッスンするオブジェクトを定義します。

classdef RespondToToggle < handle
   methods
      function obj = RespondToToggle(toggle_button_obj)
         addlistener(toggle_button_obj,'ToggleState',@RespondToToggle.handleEvnt);
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggleState is true')
         else
            disp('ToggleState is false')
         end
      end
   end
end

RespondToToggle クラスは、そのコンストラクターでリスナーを追加します。ここでは、クラスは次の 2 つの必須引数を受け入れる静的メソッドとしてコールバック (handleEvnt) を定義しています。

  • src — イベントをトリガーするオブジェクト (つまり、ToggleButton オブジェクト) のハンドル

  • evtdataevent.EventData オブジェクト

たとえば、次のコードは両方のクラスのオブジェクトを作成します。

tb = ToggleButton;
rtt = RespondToToggle(tb);

ToggleButton オブジェクトの OnStateChange メソッドを呼び出すとき、notify は常にイベントをトリガーします。この例では、コールバックは State プロパティの値を表示します。

tb.OnStateChange(true)
ToggleState is true
tb.OnStateChange(false)
ToggleState 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,'ToggleState',@RespondToToggle.handleEvnt);
         obj.ListenerHandle = hl; % Save listener handle
      end
   end
   methods (Static)
      function handleEvnt(src,~)
         if src.State
            disp('ToggleState is true')
         else
            disp('ToggleState is false')
         end
      end
   end
end

このようにコードを変更すると、RespondToToggle クラスのインスタンスからリスナーを削除できます。以下に例を示します。

tb = ToggleButton;
rtt = RespondToToggle(tb); 

オブジェクト rtt は、オブジェクト tb でトリガーされた ToggleState イベントをリッスンしています。リスナーを削除するには、リスナー ハンドルを含むプロパティに対して delete を呼び出します。

delete(rtt.ListenerHandle)

リスナーを一時的に非アクティブにするには、リスナーの一時的な非アクティブ化を参照してください。

イベント特有のデータの定義

リスナー コールバックに、イベントの結果として、[切り替え] ボタンの状態を渡す場合を考えます。event.EventData クラスをサブクラス化し、この情報を含めるためにプロパティを追加することによって、既定のイベント データにさらにデータを追加できます。これで、notify メソッドにこのオブジェクトを渡すことができます。

メモ

ToggleEventData など、event.EventData のサブクラスであるオブジェクトを保存して読み込むには、そのサブクラスの 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,'ToggleState',evtdata);

関連するトピック