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

5 ビュー (過去 30 日間)
Alexander May
Alexander May 2020 年 4 月 22 日
回答済み: Deepak 2024 年 11 月 11 日
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 日
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.

カテゴリ

Help Center および File ExchangeInteractive Control and Callbacks についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by