Main Content

uicontextmenu

Create context menu component

Description

cm = uicontextmenu creates a context menu in the current figure and returns the ContextMenu object. If a figure does not exist, then MATLAB® calls the figure function to create one.

To enable the context menu to open in the figure, you must also take these steps:

  • Assign the context menu to a UI component or graphics object in the same figure.

  • Create at least one child Menu object within the context menu.

example

cm = uicontextmenu(parent) creates a context menu in the specified parent figure. The parent can be a figure created with either the uifigure or figure function.

example

cm = uicontextmenu(___,Name,Value) specifies ContextMenu properties using one or more name-value arguments. For example, uicontextmenu("ContextMenuOpeningFcn",@myfunction) creates a context menu that executes myfunction when a user opens the context menu. Use this option with any of the input argument combinations in the previous syntaxes.

Examples

collapse all

Create a context menu with two menu items in a UI figure. Assign the context menu to the figure itself by setting the ContextMenu property of the figure to the ContextMenu object. To view the context menu, right-click anywhere in the figure window.

fig = uifigure;

cm = uicontextmenu(fig);
m1 = uimenu(cm,"Text","Menu1");
m2 = uimenu(cm,"Text","Menu2");

fig.ContextMenu = cm;

Context menu with two options: "Menu1" and "Menu2"

Create a UI figure with a button. Then, create a context menu with two menu items in the figure and assign the context menu to the button. To view the context menu, right-click on the button.

fig = uifigure;
btn = uibutton(fig);

cm = uicontextmenu(fig);
m1 = uimenu(cm,"Text","Option 1");
m2 = uimenu(cm,"Text","Option 2");

btn.ContextMenu = cm;

Context menu for a button with two options: "Option 1" and "Option 2"

Create a context menu that prints a message in the Command Window each time you open it.

Create a line plot in a figure. Then, create a context menu with one menu item and assign it to the line plot. Create a ContextMenuOpeningFcn callback function that displays output in the Command Window each time the context menu opens.

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

To view the context menu, right-click the plot line. When the context menu opens, the Command Window displays Context menu opened.

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

Since R2023b

Create an app that displays hyperlinks and allows users to copy the link URLs to the clipboard using a context menu.

In a file named hyperlinkApp.m, write a function that implements the app:

  • Create a UI figure and a grid layout manager to lay out the app.

  • Create two hyperlinks in the grid layout manager.

  • Create a context menu with a Copy Hyperlink menu item, and assign the context menu to both of the hyperlinks.

  • Write a callback function named copyHyperlink. In the callback function, access the right-clicked Hyperlink object by using the event.ContextObject event data, and then copy the URL to the clipboard. Assign the function to the MenuSelectedFcn callback property of the menu item. For more information about callbacks, see Create Callbacks for Apps Created Programmatically.

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

Before R2023b: Write the callback function to access the right-clicked Hyperlink object by querying the CurrentObject property of the figure instead of by using the event.ContextObject event data.

Run the hyperlinkApp function. Right-click one of the hyperlinks, and then select Copy Hyperlink to copy the link 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.

Since R2023b

Create an app that displays a table and allows users to delete rows by using a context menu item. Program the context menu item to appear only when a user right-clicks a row of table data.

In a file named tableApp.m, write a function that implements the app:

  • Create a UI figure and a table UI component with some random data.

  • Create a context menu with a Delete Row menu item, and assign the context menu to the table.

  • Write two callback functions to respond to context menu actions:

    • deleteRow — Query the row of the table that was right-clicked, and then delete that row.

    • toggleVisibility — Show the Delete Row menu item when the user right-clicks a row of table data, and hide the item otherwise.

    In each callback, use the event.InteractionInformation callback event data to access information about where in the table the user right-clicked to open the context menu.

  • Assign the deleteRow function to the MenuSelectedFcn callback property of the menu item, and assign the toggleVisibility function to the ContextMenuOpeningFcn callback property of the context menu. For more information about callbacks, see Create Callbacks for Apps Created Programmatically.

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

Run the tableApp function and right-click the table. The context menu appears only when you right-click a table row. Select the Delete Row item to delete the right-clicked row.

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.

The specific callback event data stored in the event.InteractionInformation property depends on the UI component that the user right-clicked to open the context menu. For more information, see the callback property descriptions on Menu Properties and ContextMenu Properties.

Since R2023b

Create a context menu for a tree component. Customize the context menu action based on the level of the tree node that the user right-clicks.

In a new script in your current folder, create a UI figure. Then, create a tree with four top-level nodes and a set of nested nodes.

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

Create a context menu with one menu item and two submenus that users can click to expand a single tree node or all of the tree nodes. For each submenu, specify a MenuSelectedFcn callback function to execute when a user selects the menu option.

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

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

Assign the context menu to the top-level tree nodes by setting the ContextMenu property of each node to the ContextMenu object.

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

At the bottom of the file, define the expandSingle and expandAll callback functions. Define the functions to accept the source and event data that MATLAB passes to all callback functions. Use the event.InteractionInformation and event.ContextObject properties to access information about where the user right-clicked to open the context menu.

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

Save and run the script. Right-click any of the top-level tree nodes to view the context menu.

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.

Input Arguments

collapse all

Parent figure, specified as a Figure object created with either the uifigure or figure function. If you do not specify a parent figure, then MATLAB calls the figure function to create a Figure object that serves as the parent.

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Example: uicontextmenu(ContextMenuOpeningFcn=@myfunction) creates a context menu that executes myfunction when a user opens the context menu.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: uicontextmenu("ContextMenuOpeningFcn",@myfunction) creates a context menu that executes myfunction when a user opens the context menu.

Note

The properties listed here are only a subset. For a complete list, see ContextMenu Properties.

Context menu opening callback function, specified as one of these values:

  • A function handle.

  • A cell array in which the first element is a function handle. Subsequent elements in the cell array are the arguments to pass to the callback function.

  • A character vector containing a valid MATLAB expression (not recommended). MATLAB evaluates this expression in the base workspace.

For more information about specifying a callback property value as a function handle, cell array, or character vector, see Specify a Callback Function.

This callback function executes when the context menu opens in response to user interaction. You can use this callback function to customize the context menu appearance based on what the user right-clicked.

This callback function can access specific information about the user's interaction with the app. MATLAB passes this information in a ContextMenuOpeningData object as the second argument to your callback function. In App Designer, the argument is named event. You can query the object properties using dot notation. For example, event.ContextObject returns information about which component the user right-clicked to open the context menu.

Note

While you can specify a ContextMenuOpeningFcn callback for any context menu, the ContextMenuOpeningData object in the callback event data is available only when the context menu satisfies both of these conditions:

  • The context menu is associated with a uifigure-based app (such as an app created in App Designer).

  • The context menu is associated with a UI component (as opposed to a graphics object, such as an Axes or Line object).

This table lists the properties of the ContextMenuOpeningData object.

PropertyValue
ContextObjectObject that the app user right-clicked to open the context menu
InteractionInformation

Information about where in the component the app user right-clicked to open the context menu. This information is stored as an object with different properties depending on the value of ContextObject.

For example, if ContextObject is a Table object, then InteractionInformation stores information about which row and column in the table the user right-clicked. For more details on the properties that InteractionInformation can have, see the next table.

SourceContext menu object that executes the callback
EventName'ContextMenuOpening'

This table lists the properties of the InteractionInformation object. The properties depend on which object the app user right-clicked to open the context menu.

ContextObjectInteractionInformation PropertyValue
AnyLocation

Location where the user right-clicked relative to the bottom-left corner of the parent container of the ContextObject, returned as a two-element vector of the form [x y].

The value of x represents the horizontal distance from the left edge of the parent container to the right-click location. The value of y represents the vertical distance from the bottom edge of the parent container to the right-click location. Distances are measured in pixels.

ScreenLocation

Location where the user right-clicked relative to the bottom-left corner of their primary display, returned as a two-element vector of the form [x y].

The value of x represents the horizontal distance from the left edge of the display to the right-click location. The value of y represents the vertical distance from the bottom edge of the display to the right-click location. Distances are measured in pixels.

TableDisplayRow

Row that the user right-clicked as it appears visually in the table, returned as a numeric scalar.

If the user has not sorted the table, then DisplayRow has the same value as Row. If the user right-clicked an area of the table UI component that is not associated with a row, then DisplayRow is an empty array.

DisplayColumn

Column that the user right-clicked as it appears visually in the table, returned as a numeric scalar.

If the user has not rearranged the table, then DisplayColumn has the same value as Column. If the user right-clicked an area of the table UI component that is not associated with a column, then DisplayColumn is an empty array.

Row

Row that the user right-clicked as it corresponds to the original table data, returned as a numeric scalar.

If the user has not sorted the table, then Row has the same value as DisplayRow. If the user right-clicked an area of the table UI component that is not associated with a row, then Row is an empty array.

Column

Column that the user right-clicked as it corresponds to the original table data, returned as a numeric scalar.

If the user has not rearranged the table, then Column has the same value as DisplayColumn. If the user right-clicked an area of the table UI component that is not associated with a column, then Column is an empty array.

RowHeaderWhether the user right-clicked the table row header, returned as a logical 0 (false) or 1 (true).
ColumnHeaderWhether the user right-clicked the table column header, returned as a logical 0 (false) or 1 (true).
TreeNode

Right-clicked node, returned as a TreeNode object.

If the user right-clicked an area of the tree that is not associated with a node, then Node is an empty array.

Level

Level of the right-clicked node, returned as a numeric scalar. Nodes parented directly to the Tree object are at level 1, nodes parented to a node at level 1 are at level 2, and so on.

If the user right-clicked an area of the tree that is not associated with a node, then Level is an empty array.

ListBoxItem

Index of the right-clicked list box item, returned as a numeric scalar.

If the user right-clicked an area of the list box that is not associated with an item, then Item is an empty array.

Context menu children, returned as an empty GraphicsPlaceholder or a vector of Menu objects.

You cannot add or remove children using the Children property. Use this property to view the list of children or to reorder the child menu items. The order of the children in this array reflects the reverse-order of how the menu items appear in an opened context menu.

For example, this code creates three context menus. When you open the context menu in the running app, Menu1 appears as the first menu option.

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 returns a list of the menu items in the reverse order.

cm.Children
ans = 

  3×1 Menu array:

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

Objects with the HandleVisibility property set to 'off' are not listed in the Children property.

To add a child to this list, set the Parent property of another Menu object to this ContextMenu object.

Tips

  • For a context menu to display in a running app, the context menu must:

    • Have at least one menu item.

    • Be assigned to a UI component or graphics object in the same figure.

  • To open a context menu programmatically, use the open function. The context menu must be the child of a figure created with the uifigure function. To display the context menu, it must have at least one menu item created with the uimenu function.

  • To open a context menu interactively, you can use the keyboard shortcut Shift+F10 when the component associated with the context menu is in focus.

Version History

Introduced before R2006a

expand all