グラフィックス オブジェクトのコールバックの作成
コールバックとは
"コールバック" は、グラフィックス オブジェクトをクリックしたり、Figure ウィンドウを閉じたりなどの、事前定義されたユーザー アクションへの応答として実行されるコマンドです。特定のユーザー アクションへの応答をプログラムするには、アクションを処理する "コールバック関数" を記述してから、その関数をユーザー アクションに関連付けられた "コールバック プロパティ" に割り当てます。たとえば、Figure の ButtonDownFcn
コールバックを作成すれば、ユーザーが Figure をクリックしたときの応答をプログラムできます。
このトピックでは、Line
、Axes
、または Figure
オブジェクトなどのグラフィックス オブジェクトのコールバックを記述する例を示します。特定のグラフィックス オブジェクトに関連付けられたコールバックの一覧については、そのオブジェクトのプロパティを参照してください。たとえば、Figure
コールバックの一覧については、Figure のプロパティを参照してください。
アプリの UI コンポーネントのコールバックを記述する方法については、プログラムで作成したアプリ用のコールバックの作成を参照してください。
基本のコールバックの作成
グラフィックス コールバック関数は、少なくとも 2 つの入力引数を受け入れなければなりません。
コールバックを実行中のグラフィックス オブジェクト — コールバック関数内でこの引数を使用してオブジェクトを参照します。
イベント データ構造体 — コールバック関数内でこの引数を使用して、コールバック プロパティおよびオブジェクトに固有のユーザー アクションに関する情報にアクセスします。多くのグラフィックス オブジェクト コールバックでは、この構造体は空です。
ユーザー アクションに応答してコールバックが実行されると、MATLAB® でコールバック関数が呼び出され、これら 2 つの引数がその関数に渡されます。
コールバックを作成するには、最初に必須の入力引数を指定してコールバック関数を定義します。次に、関数ハンドルを関連のコールバック プロパティに割り当てます。
コールバック関数の定義
たとえば、figureCallback.m
という名前の新しいファイルを作成し、figureCallback
という名前のコールバック関数を定義します。ユーザーが figure ウィンドウでキーを押すと、コールバック関数がアクションを処理します。次の 2 つの入力引数を受け入れるコールバック関数を定義します。
src
— 最初の引数を使用して、コールバックを実行中の特定の Figure を参照して、Figure でプロットされているLine
オブジェクトを見つけます。event
— 2 つ目の引数を使用して、キーを押すユーザー アクションに関する特定の情報にアクセスします。押されたキーが + であればラインの幅を広げ、- であればラインの幅を狭めます。
function figureCallback(src,event) line = findobj(src,"Type","Line"); if event.Character == "+" line.LineWidth = line.LineWidth+1; elseif event.Character == "-" line.LineWidth = max(line.LineWidth-1,0.5); end end
コールバック プロパティへのコールバック関数の割り当て
コマンド ウィンドウで、Figure
オブジェクトを作成します。@
演算子を使用して、関数ハンドルを Figure の WindowKeyPressFcn
プロパティに割り当てます。ユーザーが Figure ウィンドウでキーを押すと、このコールバックが実行されます。次に、現在の Figure にデータをプロットします。
f = figure(WindowKeyPressFcn=@figureCallback); plot(1:10)
コードを実行し、+ キーを押します。ラインの幅が広がります。
メモ
現在、キーボードベースのコールバックは、ライブ エディターの Figure ではサポートされていません。詳細については、Figure のプロパティを参照してください。
追加の入力引数を使用するコールバックの作成
"無名関数" を使用して、追加の入力引数を使用するコールバックを作成できます。最初に、任意の数の入力引数を使用するコールバック関数を定義します。次に、MATLAB がコールバックに渡す必須のソース引数とイベント引数を受け入れる無名関数として関連のコールバック プロパティの値を指定してから、適切な入力を指定してコールバック関数を呼び出します。
メモ
現在、ライブ エディターの Figure ではコールバックを無名関数として作成することはできません。
コールバック関数の定義
たとえば、ユーザーがマーカーをクリックしたときにマーカー エッジの色を変更し、コマンド ウィンドウに x 座標と y 座標を表示するコールバック関数を定義します。displayCoordinates.m
という名前の新しいファイルを作成し、displayCoordinates
という名前のコールバック関数を定義します。次の 3 つの入力引数を受け入れるコールバック関数を定義します。
src
— 最初の引数を使用して、コールバックを実行中の特定のグラフィックス オブジェクトを参照します。~
— 2 つ目の引数に~
文字を指定して、この関数がコールバック イベント データを使用しないことを示します。ax
— 3 つ目の引数を使用して、座標軸におけるマウス ポインターの位置にアクセスします。
function displayCoordinates(src,~,ax) src.MarkerEdgeColor = rand(1,3); disp(ax.CurrentPoint(1,1:2)) end
コールバック プロパティへのコールバック関数の割り当て
コマンド ウィンドウで、関数 scatter
を使用して axes オブジェクト上にデータをプロットします。無名関数を使用して、Scatter
オブジェクトの ButtonDownFcn
コールバック プロパティを指定します。無名関数は、MATLAB がコールバックに渡す必須のソース引数とイベント引数を受け入れてから、必須の入力を指定して関数 displayCoordinates
を呼び出します。
ax = axes;
x = randn(100,1);
y = randn(100,1);
scatter(x,y,"ButtonDownFcn",@(src,event)displayCoordinates(src,event,ax))
コードを実行し、マーカーをクリックします。マーカー エッジの色が変化し、コマンド ウィンドウに x 座標と y 座標が表示されます。
詳細については、無名関数を参照してください。
無名関数は、ソース入力とイベント入力以外のコールバック入力引数を最も柔軟に指定できる方法ですが、代わりに cell 配列を使用してコールバックを指定する場合もあります。コールバック関数がソース入力とイベント入力の両方、およびその後に続く他の任意の引数を受け入れる場合、cell 配列を指定することで、コールバックを割り当てることができます。cell 配列の最初の要素はコールバック関数ハンドルであり、追加の要素はソースおよびイベントの後に関数に渡す入力です。
たとえば、代わりに cell 配列を使用して Scatter
オブジェクトの ButtonDownFcn
コールバック プロパティを指定できます。配列の最初の要素は関数 displayCoordinates
のハンドルで、2 番目の要素はソース引数とイベント引数の後に関数 displayCoordinates
に渡される axes オブジェクトです。
ax = axes;
x = randn(100,1);
y = randn(100,1);
scatter(x,y,"ButtonDownFcn",{@displayCoordinates,ax})
既定値としてのコールバックの作成
plot
や bar
などのプロット関数を呼び出すと、MATLAB では新しいグラフィックス オブジェクトが作成され、Figure や座標軸のほとんどのプロパティがリセットされます。そのため、特定のグラフィックス オブジェクトに定義したコールバック関数が MATLAB で削除される場合があります。代わりに特定のタイプの "すべて" のオブジェクトに対して実行されるコールバックを作成するには、ルート レベルでコールバック関数を既定として割り当てます。
コールバック関数の定義
customizeGrid
という名前の関数を customizeGrid.m
という名前の新しいファイルで定義します。関数は axes オブジェクトを受け取り、そのグリッド ラインを表示およびカスタマイズします。
function customizeGrid(ax) ax.XGrid = 'on'; ax.YGrid = 'on'; ax.GridLineStyle = '--'; ax.GridAlpha = 0.5; end
コールバック プロパティへのコールバック関数の割り当て
groot
オブジェクトに既定の座標軸の CreateFcn
コールバックを設定すると、MATLAB で新しい axes オブジェクトが作成されるたびに、関数 customizeGrid
が実行されます。2 つの必須のコールバック入力を受け取ってから、作成中の Axes
オブジェクトに対して関数 customizeGrid
を呼び出す無名関数としてプロパティを割り当てます。
set(groot,"defaultAxesCreateFcn",@(src,~)customizeGrid(src))
Figure に複数の座標軸を作成します。各座標軸のカスタマイズされたグリッドが表示されます。
ax1 = axes("Position",[0.1 0.1 0.8 0.35]); ax2 = axes("Position",[0.1 0.55 0.8 0.35]);
詳細については、既定のプロパティ値を参照してください。
既定のコールバックの設定は、その MATLAB セッションに対して維持されます。すべての MATLAB セッションで既定のコールバックを設定するには、startup.m
ファイルに既定値の割り当てを追加します。詳細については、startup
を参照してください。