メインコンテンツ

ContextMenu

コンテキスト メニュー UI コンポーネント

  • Context menu UI component

説明

コンテキスト メニュー UI コンポーネントは、グラフィックス オブジェクトまたは UI コンポーネントを右クリックしたときに、一連のメニュー項目を表示します。ContextMenu オブジェクトを使用して、コンテキスト メニューの作成後にコンテキスト メニューの外観と動作を変更します。

作成

uicontextmenu 関数を使用して、Figure でコンテキスト メニューを作成します。

プロパティ

すべて展開する

コールバック

コンテキスト メニューを開くコールバック関数。次の値のいずれかとして指定します。

  • 関数ハンドル。

  • 最初の要素が関数ハンドルである cell 配列。cell 配列内のその後の要素はコールバック関数に渡される引数です。

  • 有効な MATLAB® 式を含む文字ベクトル (非推奨)。MATLAB は、この式をベース ワークスペースで評価します。

コールバックのプロパティ値を関数ハンドル、cell 配列または文字ベクトルとして指定する方法の詳細については、コールバック関数の指定を参照してください。

このコールバック関数は、ユーザー操作に応答してコンテキスト メニューが開くときに実行されます。このコールバック関数を使用して、ユーザーが何を右クリックしたのかに基づいてコンテキスト メニューの外観をカスタマイズできます。

このコールバック関数は、ユーザーのアプリ操作に関する特定の情報にアクセスできます。MATLAB は、この情報を ContextMenuOpeningData オブジェクトに格納して、2 番目の引数としてコールバック関数に渡します。App Designer では、引数は event という名前です。ドット表記を使用して、オブジェクトのプロパティをクエリできます。たとえば、event.ContextObject は、コンテキスト メニューを開くためにユーザーが右クリックしたコンポーネントに関する情報を返します。

メモ

任意のコンテキスト メニューに対して ContextMenuOpeningFcn コールバックを指定できますが、コールバック イベント データの ContextMenuOpeningData オブジェクトは、コンテキスト メニューが以下の両方の条件を満たしている場合にのみ使用可能です。

  • コンテキスト メニューが uifigure ベースのアプリ (App Designer で作成されたアプリなど) に関連付けられている。

  • Axes オブジェクトや Line オブジェクトなどのグラフィックス オブジェクトではなく、UI コンポーネント、または UI コンポーネントのみを含むコンテナーにコンテキスト メニューが関連付けられている。

次の表に、ContextMenuOpeningData オブジェクトのプロパティを示します。

プロパティ
ContextObjectアプリ ユーザーがコンテキスト メニューを開くために右クリックしたオブジェクト
InteractionInformation

アプリ ユーザーがコンテキスト メニューを開くために右クリックしたコンポーネント内の位置に関する情報。この情報は、ContextObject の値に応じて異なるプロパティをもつオブジェクトとして格納されます。

たとえば、ContextObjectTable オブジェクトの場合、InteractionInformation は、ユーザーが右クリックしたテーブル内の行と列に関する情報を格納します。InteractionInformation がもつことのできるプロパティの詳細については、次の表を参照してください。

Sourceコールバックを実行するコンテキスト メニュー オブジェクト
EventName'ContextMenuOpening'

次の表に、InteractionInformation オブジェクトのプロパティを示します。プロパティは、アプリ ユーザーがコンテキスト メニューを開くために右クリックしたオブジェクトによって異なります。

ContextObjectInteractionInformation プロパティ
任意Location

ContextObject の親コンテナーの左下隅を基準とした、ユーザーが右クリックした位置。[x y] の形式の 2 要素ベクトルとして返されます。

x の値は、親コンテナーの左端から右クリック位置までの水平距離を表します。y の値は、親コンテナーの下端から右クリック位置までの垂直距離を表します。距離はピクセル単位で測定されます。

ScreenLocation

プライマリ ディスプレイの左下隅を基準とした、ユーザーが右クリックした位置。[x y] の形式の 2 要素ベクトルとして返されます。

x の値は、ディスプレイの左端から右クリック位置までの水平距離を表します。y の値は、ディスプレイの下端から右クリック位置までの垂直距離を表します。距離はピクセル単位で測定されます。

TableDisplayRow

ユーザーの右クリック位置に視覚的に表示されているテーブルの行。数値スカラーとして返されます。

ユーザーがテーブルを並べ替えていない場合、DisplayRow の値は Row と同じになります。ユーザーが右クリックしたテーブル UI コンポーネントの領域が行に関連付けられていない場合、DisplayRow は空の配列になります。

DisplayColumn

ユーザーの右クリック位置に視覚的に表示されているテーブルの列。数値スカラーとして返されます。

ユーザーがテーブルを再配列していない場合、DisplayColumn の値は Column と同じになります。ユーザーが右クリックしたテーブル UI コンポーネントの領域が列に関連付けられていない場合、DisplayColumn は空の配列になります。

Row

ユーザーの右クリック位置に対応する元のテーブル データの行。数値スカラーとして返されます。

ユーザーがテーブルを並べ替えていない場合、Row の値は DisplayRow と同じになります。ユーザーが右クリックしたテーブル UI コンポーネントの領域が行に関連付けられていない場合、Row は空の配列になります。

Column

ユーザーの右クリック位置に対応する元のテーブル データの列。数値スカラーとして返されます。

ユーザーがテーブルを再配列していない場合、Column の値は DisplayColumn と同じになります。ユーザーが右クリックしたテーブル UI コンポーネントの領域が列に関連付けられていない場合、Column は空の配列になります。

RowHeaderユーザーがテーブルの行ヘッダーを右クリックしたかどうか。logical 0 (false) または logical 1 (true) として返されます。
ColumnHeaderユーザーがテーブルの列ヘッダーを右クリックしたかどうか。logical 0 (false) または logical 1 (true) として返されます。
TreeNode

右クリックされたノード。TreeNode オブジェクトとして返されます。

ユーザーが右クリックしたツリーの領域がノードに関連付けられていない場合、Node は空の配列になります。

Level

右クリックされたノードのレベル。数値スカラーとして返されます。Tree オブジェクトを直接の親とするノードがレベル 1、レベル 1 のノードを親とするノードがレベル 2 となり、以下同様に続きます。

ユーザーが右クリックしたツリーの領域がノードに関連付けられていない場合、Level は空の配列になります。

ListBoxItem

右クリックされたリスト ボックス項目のインデックス。数値スカラーとして返されます。

ユーザーが右クリックしたリスト ボックスの領域が項目に関連付けられていない場合、Item は空の配列になります。

オブジェクト作成関数。次の値のいずれかとして指定します。

  • 関数ハンドル。

  • 最初の要素が関数ハンドルである cell 配列。cell 配列内のその後の要素はコールバック関数に渡される引数です。

  • 有効な MATLAB 式を含む文字ベクトル (非推奨)。MATLAB は、この式をベース ワークスペースで評価します。

コールバックを関数ハンドル、cell 配列、または文字ベクトルとして指定する方法の詳細については、App Designer のコールバックを参照してください。

このプロパティは、MATLAB がオブジェクトを作成するときに実行されるコールバック関数を指定します。MATLAB は CreateFcn コールバックを実行する前に、すべてのプロパティ値を初期化します。CreateFcn プロパティを指定しない場合、MATLAB は既定の作成関数を実行します。

既存のコンポーネントに CreateFcn プロパティを設定しても効果はありません。

このプロパティを関数ハンドルまたは cell 配列として指定した場合、コールバック関数の最初の引数を使用して、作成中のオブジェクトにアクセスできます。それ以外の場合は、関数 gcbo を使用してオブジェクトにアクセスします。

オブジェクト削除関数。次の値のいずれかとして指定します。

  • 関数ハンドル。

  • 最初の要素が関数ハンドルである cell 配列。cell 配列内のその後の要素はコールバック関数に渡される引数です。

  • 有効な MATLAB 式を含む文字ベクトル (非推奨)。MATLAB は、この式をベース ワークスペースで評価します。

コールバックを関数ハンドル、cell 配列、または文字ベクトルとして指定する方法の詳細については、App Designer のコールバックを参照してください。

このプロパティは、MATLAB がオブジェクトを削除するときに実行されるコールバック関数を指定します。MATLAB は、オブジェクトのプロパティを破棄する前に DeleteFcn コールバックを実行します。DeleteFcn プロパティを指定しない場合、MATLAB は既定の削除関数を実行します。

このプロパティを関数ハンドルまたは cell 配列として指定した場合、コールバック関数の最初の引数を使用して、削除されるオブジェクトにアクセスできます。それ以外の場合は、関数 gcbo を使用してオブジェクトにアクセスします。

コールバック実行制御

コールバックの割り込み。'on' または 'off'、もしくは数値または logical 1 (true) または 0 (false) として指定します。'on' の値は true と等価であり、'off' の値は false と等価です。したがって、このプロパティの値を logical 値として使用できます。値は matlab.lang.OnOffSwitchState 型の on/off logical 値として格納されます。

このプロパティは実行中のコールバックが割り込み可能かどうかを決定します。次の 2 つのコールバックの状態について考慮する必要があります。

  • "実行中" コールバックは、現在実行しているコールバックです。

  • "割り込み" コールバックは、実行中のコールバックに割り込もうとするコールバックです。

MATLAB は、コールバック キューを処理するコマンドを実行するたびにコールバックの割り込み動作を判別します。これらのコマンドには、drawnowfigureuifiguregetframewaitforpause があります。

実行中コールバックにこれらのコマンドが含まれていない場合、割り込みは発生しません。MATLAB は、実行中コールバックの実行を先に終了させ、その後に割り込みコールバックを実行します。

実行中コールバックにこれらのいずれかのコマンドが含まれている場合、実行中コールバックを所有するオブジェクトの Interruptible プロパティに応じて割り込みが発生するかどうかが決まります。

  • Interruptible の値が 'off' の場合、割り込みは発生しません。代わりに、割り込みコールバックを所有するオブジェクトの BusyAction プロパティに応じて、割り込みコールバックが破棄されるかコールバック キューに追加されるかが決まります。

  • Interruptible の値が 'on' の場合、割り込みが発生します。MATLAB は、コールバック キューの次回処理時に、実行中コールバックの実行を停止し、割り込みコールバックを実行します。割り込みコールバックが完了した後、MATLAB は実行中だったコールバックの実行を再開します。

メモ

コールバックの割り込みと実行は、以下の状況では動作が異なります。

  • 割り込みコールバックが DeleteFcnCloseRequestFcn または SizeChangedFcn コールバックの場合、Interruptible プロパティの値にかかわらず割り込みが発生します。

  • 実行中のコールバックが関数 waitfor を現在実行している場合、Interruptible プロパティの値にかかわらず割り込みが発生します。

  • 割り込みコールバックが Timer オブジェクトで所有されている場合、Interruptible プロパティの値にかかわらずスケジュールに従ってコールバックが実行されます。

メモ

MATLAB は、割り込みが発生したときにプロパティの状態や表示を保存しません。たとえば、gca コマンドや gcf コマンドから返されたオブジェクトは、別のコールバックを実行するときに変更されている可能性があります。

コールバック キューイング。'queue' または 'cancel' として指定します。BusyAction プロパティは MATLAB による割り込みコールバックの実行の処理方法を決定します。次の 2 つのコールバックの状態について考慮する必要があります。

  • "実行中" コールバックは、現在実行しているコールバックです。

  • "割り込み" コールバックは、実行中のコールバックに割り込もうとするコールバックです。

BusyAction プロパティによってコールバック キューイングの動作が決まるのは、次の両方の条件を満たす場合のみです。

  • 実行中コールバックに drawnowfigureuifiguregetframewaitforpause などのコールバック キューを処理するコマンドが含まれている。

  • 実行中コールバックを所有するオブジェクトの Interruptible プロパティの値が 'off' である。

これらの条件に当てはまる場合、割り込みコールバックを所有するオブジェクトの BusyAction プロパティに応じて MATLAB による割り込みコールバックの処理方法が決まります。BusyAction プロパティは次の値を取ることができます。

  • 'queue' — 割り込みコールバックをキューに入れ、実行中のコールバックが終了した後に処理されるようにします。

  • 'cancel' — 割り込みコールバックを実行しません。

この プロパティ は読み取り専用です。

削除状態。matlab.lang.OnOffSwitchState 型の on/off logical 値として返されます。

MATLAB は、DeleteFcn コールバックが実行を開始すると、BeingDeleted プロパティを 'on' に設定します。コンポーネント オブジェクトが存在しなくなるまで BeingDeleted プロパティは 'on' に設定されたままです。

クエリや変更の前にオブジェクトが削除されようとしていないか確認するために BeingDeleted プロパティの値をチェックします。

親/子

親オブジェクト。uifigure 関数または figure 関数で作成された Figure オブジェクトとして指定します。親 Figure を指定しない場合は、MATLAB で関数 figure が呼び出されて親となる Figure が作成されます。

このプロパティをターゲット Figure オブジェクトに設定することで、ContextMenu オブジェクトを別の Figure に移動できます。

コンテキスト メニューの子。空の GraphicsPlaceholder または Menu オブジェクトのベクトルとして返されます。

Children プロパティを使用して子の追加や削除を行うことはできません。このプロパティは、子のリストの表示や子メニュー項目の並べ替えに使用します。この配列の子の順序は、開いたコンテキスト メニューでのメニュー項目表示順序の逆になります。

たとえば、このコードは 3 つのコンテキスト メニューを作成します。実行中のアプリでコンテキスト メニューを開くと、最初のメニュー項目として Menu1 が表示されます。

fig = uifigure;
cm = uicontextmenu(fig);
m1 = uimenu(cm,'Text','Menu1');
m2 = uimenu(cm,'Text','Menu2');
m3 = uimenu(cm,'Text','Menu3');
fig.ContextMenu = cm;
Context menu with three menu items.

cm.Children は、メニュー項目のリストを逆順で返します。

cm.Children
ans = 

  3×1 Menu array:

  Menu    (Menu3)
  Menu    (Menu2)
  Menu    (Menu1)

HandleVisibility プロパティが 'off' に設定されているオブジェクトは Children プロパティにリストされません。

子をこのリストに追加するには、別の Menu オブジェクトの Parent プロパティをこの ContextMenu オブジェクトに設定します。

オブジェクト ハンドルの可視性。'on''callback' または 'off' として指定します。

このプロパティは、オブジェクトの親がもつ子のリストにおけるそのオブジェクトの可視性を制御します。オブジェクトがその親オブジェクトのリストで、子として可視できない場合、オブジェクト階層の検索またはプロパティのクエリによってオブジェクトを取得する関数は、そのオブジェクトを返しません。このような関数には getfindobjgcagcfgconewplotclaclf および close があります。HandleVisibility プロパティはまた、親 Figure の CurrentObject プロパティでオブジェクトのハンドルの可視性も制御します。オブジェクトは参照できない場合も有効です。オブジェクトにアクセスできる場合は、そのプロパティを設定および取得して、それをオブジェクトに作用する任意の関数に渡すことができます。

HandleVisibility の値説明
'on'オブジェクト ハンドルは常に表示されます。
'callback'オブジェクト ハンドルはコールバック内から、あるいはコールバックにより呼び出される関数から参照できます。しかし、コマンド ラインから呼び出される関数からは参照できません。このオプションを使用すると、コマンド ラインからのオブジェクトへのアクセスがブロックされますが、コールバック関数からはアクセスできます。
'off'オブジェクト ハンドルは常に非表示です。このオプションは、他の関数による UI の意図しない変更を防止するために役立ちます。HandleVisibility'off' に設定すると、その関数の実行中にハンドルが一時的に非表示になります。

識別子

この プロパティ は読み取り専用です。

グラフィックス オブジェクトのタイプ。'uicontextmenu' として返されます。

オブジェクト識別子。文字ベクトルまたは string スカラーとして指定します。オブジェクトの識別子として機能する一意の Tag 値を指定できます。コードの他の部分からオブジェクトにアクセスする必要がある場合、関数 findobj を使用して Tag 値に基づいてオブジェクトを検索できます。

ユーザー データ。任意の配列として指定します。UserData を指定すると、アプリ内でデータを共有するのに役立ちます。詳細については、コールバック間のデータ共有を参照してください。

すべて折りたたむ

コンテキスト メニューを開くたびに、コマンド ウィンドウにメッセージが表示されるコンテキスト メニューを作成します。

Figure にライン プロットを作成します。その後、メニュー項目を 1 つ持つコンテキスト メニューを作成し、そのライン プロットに割り当てます。コンテキスト メニューが開くたびにコマンド ウィンドウに出力を表示するコールバック関数 ContextMenuOpeningFcn を作成します。

f = figure;
cm = uicontextmenu(f);
m = uimenu(cm,"Text","Menu1");
cm.ContextMenuOpeningFcn = @(src,event)disp("Context menu opened");
p = plot(1:10,"ContextMenu",cm);

コンテキスト メニューを表示するには、プロット ラインを右クリックします。コンテキスト メニューが開くと、コマンド ウィンドウに Context menu opened と表示されます。

The context menu with a menu item called "Menu1" displays on the plot line.

R2023b 以降

ハイパーリンクを表示し、ユーザーがコンテキスト メニューを使用してリンクの URL をクリップボードにコピーできるようにするアプリを作成します。

hyperlinkApp.m という名前のファイルで、アプリを実装する関数を作成します。

  • UI Figure およびグリッド レイアウト マネージャーを作成してアプリをレイアウトします。

  • グリッド レイアウト マネージャーで 2 つのハイパーリンクを作成します。

  • [ハイパーリンクのコピー] メニュー項目をもつコンテキスト メニューを作成し、そのコンテキスト メニューを両方のハイパーリンクに割り当てます。

  • copyHyperlink という名前のコールバック関数を作成します。コールバック関数で、event.ContextObject イベント データを使用して、右クリックされた Hyperlink オブジェクトにアクセスし、その URL をクリップボードにコピーします。関数をメニュー項目の MenuSelectedFcn コールバック プロパティに割り当てます。コールバックの詳細については、プログラムで作成したアプリ用のコールバックの作成を参照してください。

function hyperlinkApp
fig = uifigure;
g = uigridlayout(fig,[2, 1]);
g.RowHeight = {'fit','fit'};

hlink1 = uihyperlink(g);
hlink1.Text = "MathWorks Home";
hlink1.URL = "https://www.mathworks.com/";
hlink2 = uihyperlink(g);
hlink2.Text = "MATLAB App Building";
hlink2.URL = "https://www.mathworks.com/products/matlab/app-designer.html";

cm = uicontextmenu(fig);
m = uimenu(cm);
m.Text = "Copy Hyperlink";
hlink1.ContextMenu = cm;
hlink2.ContextMenu = cm;

m.MenuSelectedFcn = @copyHyperlink;
end

function copyHyperlink(src,event)
url = event.ContextObject.URL;
clipboard("copy",url)
end

R2023b より前: event.ContextObject イベント データを使用するのではなく、Figure の CurrentObject プロパティにクエリすることで、右クリックされた Hyperlink オブジェクトにアクセスするコールバック関数を作成します。

関数 hyperlinkApp を実行します。ハイパーリンクの 1 つを右クリックし、[ハイパーリンクのコピー] を選択してリンクの URL をコピーします。

UI figure window with two hyperlink UI components. A context menu with a "Copy Hyperlink" menu item is open and the pointer is pointing to the menu item.

R2023b 以降

テーブルを表示し、ユーザーがコンテキスト メニュー項目を使用して行を削除できるようにするアプリを作成します。ユーザーがテーブル データの行を右クリックしたときにのみ表示するコンテキスト メニュー項目をプログラムします。

tableApp.m という名前のファイルで、アプリを実装する関数を作成します。

  • ランダム データを使用して、UI Figure とテーブル UI コンポーネントを作成します。

  • [行の削除] メニュー項目をもつコンテキスト メニューを作成し、そのコンテキスト メニューをテーブルに割り当てます。

  • コンテキスト メニューのアクションに応答する 2 つのコールバック関数を作成します。

    • deleteRow — 右クリックされたテーブル行にクエリし、その行を削除します。

    • toggleVisibility — ユーザーがテーブル データの行を右クリックしたときに [行の削除] メニュー項目を表示し、それ以外のときにはその項目を非表示にします。

    各コールバックで、event.InteractionInformation コールバック イベント データを使用して、ユーザーがコンテキスト メニューを開くために右クリックしたテーブル内の位置に関する情報にアクセスします。

  • 関数 deleteRow をメニュー項目の MenuSelectedFcn コールバック プロパティに割り当て、関数 toggleVisibility をコンテキスト メニューの ContextMenuOpeningFcn コールバック プロパティに割り当てます。コールバックの詳細については、プログラムで作成したアプリ用のコールバックの作成を参照してください。

function tableApp
fig = uifigure;
tbl = uitable(fig);
tbl.Position = [20 20 400 300];
tbl.Data = randi(10,[10 4]);

cm = uicontextmenu(fig);
m = uimenu(cm);
m.Text = "Delete Row";
tbl.ContextMenu = cm;

m.MenuSelectedFcn = @deleteRow;
cm.ContextMenuOpeningFcn = @(src,event)toggleVisibility(src,event,m);
end

function deleteRow(src,event)
tbl = event.ContextObject;
row = event.InteractionInformation.Row;
tbl.Data(row,:) = [];
end

function toggleVisibility(src,event,m)
row = event.InteractionInformation.Row;
rowClicked = ~isempty(row);
m.Visible = rowClicked;
end

関数 tableApp を実行し、テーブルを右クリックします。コンテキスト メニューは、テーブル行を右クリックしたときにのみ表示されます。[行の削除] 項目を選択して、右クリックした行を削除します。

UI figure window with a table. A context menu with a "Delete Row" item is visible over a table row header and the pointer is pointing to the menu item.

event.InteractionInformation プロパティに格納される特定のコールバック イベント データは、ユーザーがコンテキスト メニューを開くために右クリックした UI コンポーネントによって異なります。詳細については、Menu および ContextMenu のコールバック プロパティの説明を参照してください。

R2023b 以降

ツリー コンポーネントのコンテキスト メニューを作成します。ユーザーが右クリックしたツリー ノードのレベルに基づいて、コンテキスト メニュー アクションをカスタマイズします。

現在のフォルダー内の新規スクリプトに、UI figure を作成します。次に、4 つの最上位ノードと入れ子ノードのセットをもつツリーを作成します。

fig = uifigure;

t = uitree(fig,"Position",[20 200 175 100]);

category1 = uitreenode(t,"Text","Runners");
r1 = uitreenode(category1,"Text","Joe");
r2 = uitreenode(category1,"Text","Linda");

category2 = uitreenode(t,"Text","Cyclists");
c1 = uitreenode(category2,"Text","Rajeev");

category3 = uitreenode(t,"Text","Hikers");
h1 = uitreenode(category3,"Text","Jack");

category4 = uitreenode(t,"Text","Swimmers");
s1 = uitreenode(category4,"Text","Logan");

UI figure window with a tree that has four collapsed top-level nodes

ユーザーがクリックして単一のツリー ノードまたはすべてのツリー ノードを展開できるメニュー項目を 1 つとサブメニューを 2 つ備えた、コンテキスト メニューを作成します。各サブメニューに対してコールバック関数 MenuSelectedFcn を指定し、ユーザーがメニュー オプションを選択すると実行されるようにします。

cm = uicontextmenu(fig);
m1 = uimenu(cm,"Text","Expand...");

sbm1 = uimenu(m1,"Text","This Node", ...
    "MenuSelectedFcn",@expandSingle);
sbm2 = uimenu(m1,"Text","All Nodes", ...
    "MenuSelectedFcn",@expandAll);

各ノードの ContextMenu プロパティを ContextMenu オブジェクトに設定することで、コンテキスト メニューを最上位のツリー ノードに割り当てます。

category1.ContextMenu = cm;
category2.ContextMenu = cm;
category3.ContextMenu = cm;
category4.ContextMenu = cm;

ファイルの下部で、コールバック関数 expandSingle および expandAll を定義します。MATLAB がすべてのコールバック関数に渡すソースとイベント データを受け入れるように、関数を定義します。event.InteractionInformation プロパティおよび event.ContextObject プロパティを使用して、ユーザーがコンテキスト メニューを開くために右クリックした位置に関する情報にアクセスします。

function expandSingle(src,event)
node = event.InteractionInformation.Node;
expand(node)
end

function expandAll(src,event,t)
n = event.ContextObject;
t = ancestor(n,"uitree");
expand(t)
end

スクリプトを保存して実行します。任意の最上位のツリー ノードを右クリックし、コンテキスト メニューを表示します。

UI figure window with a tree that has four collapsed top-level nodes. Over the "Cyclists" node, a context menu with an "Expand" menu item and two submenu items, "This Node" and "All Nodes", is visible. The pointer is pointing to the "All Nodes" item.

バージョン履歴

R2006a より前に導入

すべて展開する