イベントとリスナーの構文
実装するコンポーネント
イベントとリスナーの実装には、以下のコンポーネントが含まれます。
ハンドル クラスでのイベントの名前の指定 — イベントの命名。
アクションが発生したときにイベントをトリガーする関数またはメソッド — イベントのトリガー。
トリガーされたイベントへの応答でコールバック関数を実行するリスナー オブジェクト — イベントのリスニング。
イベントがコールバック関数に渡す既定のイベント データまたはカスタム イベント データ — イベント特有のデータの定義。
イベントの命名
イベントを定義するには、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
— イベントのソースであるオブジェクトToggleState
—char
ベクトルとして渡されるイベント名@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
オブジェクト) のハンドルevtdata
—event.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);