Missing context menu for "axes" contained in "uifigure" parent

Hello,
I would like to enable the default context menu functionality for axes objects inside a uifigure parent (or a panel within a uifigure).
For an axes within a figure object, the context menu appears when the user has selected one of the axes toolbar buttons and subsequently right clicks on the axes. However, for an axes within a uifigure object, the context menu does not appear. See code below for a guided example of this behavior difference.
Is it possible to enable this default context menu functionality for an axes within a uifigure hierarchy?
% Compare default context menu functionality with Axes objects created in a
% figure and uifigure parent.
% Figure parent
h = figure;
ax = axes(h);
title(ax, 'This is a ''figure'' with an ''axes'' child')
disp('A figure has been created with an axes child.')
disp('Select a toolbar interaction button, such as the Zoom button.')
disp('Right click on the axes and observe the context menu which appears.')
input('Press enter to continue');
disp('---')
% UIFigure parent
hUI = uifigure;
axUI = axes(hUI);
title(axUI, 'This is a ''uifigure'' with an ''axes'' child')
disp('A uifigure has been created with an axes child.')
disp('Select a toolbar interaction button, such as the Zoom button.')
disp('Note that no context menu appears.')
disp('How can one enable the default context menus for axes contained in a uifigure?')
input('Press enter to close figures');
delete(h)
delete(hUI)

1 件のコメント

Luc
Luc 2021 年 3 月 15 日
I had the same problem and noticed that this will do the trick:
app.UIAxesZoom=zoom(app.UIAxes);
setAllowAxesZoom(app.UIAxesZoom,app.UIAxes,1);

サインインしてコメントする。

回答 (1 件)

Deepak
Deepak 2024 年 11 月 11 日

0 投票

In MATLAB, uifigure and figure objects have different underlying architectures, which is why we notice differences in behaviour, such as the context menu functionality. The uifigure is based on a newer UI framework that supports modern app building, but it doesn't support all features available in the traditional figure.
To enable a context menu for axes within a uifigure, we need to manually create a uicontextmenu and associate it with the axes. We can use uicontextmenu to create a context menu that can be attached to UI components within a uifigure. By utilizing uimenu, we can add items to this context menu, with each item capable of being assigned a specific callback function through the MenuSelectedFcn property. Finally, the ContextMenu property of the axes object allows us to assign the created context menu to the axes, enabling customized right-click interactions.
Here is the sample MATLAB code to achieve the same:
% Create a UIFigure
hUI = uifigure;
axUI = axes(hUI);
title(axUI, 'This is a ''uifigure'' with an ''axes'' child')
% Create a UIContextMenu
cm = uicontextmenu(hUI);
% Define menu items
m1 = uimenu(cm, 'Text', 'Zoom In', 'MenuSelectedFcn', @(src,event) zoom(axUI, 'on'));
m2 = uimenu(cm, 'Text', 'Zoom Out', 'MenuSelectedFcn', @(src,event) zoom(axUI, 'out'));
% Assign the context menu to the axes
axUI.ContextMenu = cm;
disp('A uifigure has been created with an axes child.')
disp('Right click on the axes to see the custom context menu.')
input('Press enter to close the figure');
delete(hUI)
Please see the attached documentation for the functions referenced:
I hope this assists in resolving the issue.

カテゴリ

ヘルプ センター および File ExchangeInteractive Control and Callbacks についてさらに検索

質問済み:

2020 年 4 月 22 日

回答済み:

2024 年 11 月 11 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by