我有什么:
在Matlab-GUI中,我有一个连接到图(=轴)的uicontextmenu。如果我通过鼠标单击(右键)“激活”这个,我可以使用通常的“回调”来做一些事情,比如突出显示情节。如果用户然后选择菜单的uimenu元素之一,我可以使用此uimenu元素的回调并重置突出显示。 但是如果用户没有选择元素,则存在问题。上下文菜单消失了,如果发生这种情况,我找不到找出方法。在我的示例中,突出显示的图表保持突出显示。
到目前为止我尝试了什么:
除了阅读文档之外,我还将属性的监听器附加到某些uimenu元素,例如:
addlistener(mymenu_element, 'Visible', 'PostSet', @mytest);
但是这个属性以及其他属性似乎在任何时候都不会被改变或触及 - 有点让我感到惊讶:o
所以问题是:
有没有办法在执行uicontextmenu之后执行一个函数(或者你在上下文菜单“消失”时调用它)?换句话说:如果用户没有选择上下文菜单的元素,那么如何识别它呢?
答案 0 :(得分:1)
由于您无法听取这些内容(我已经进行了一些测试并得出了相同的结论),您可以通过以不同的方式创建和管理您的uicontextmenu来解决这个问题:
function yourFunction
% create a figure
hFig = figure;
% add a listener to the mouse being pressed
addlistener ( hFig, 'WindowMousePress', @(a,b)mouseDown(hFig) );
end
function mouseDown(hFig)
% react depening on the mouse selection type:
switch hFig.SelectionType
case 'alt' % right click
% create a uicontext menu and store in figure data
hFig.UserData.uic = uicontextmenu ( 'parent', hFig );
% create the menu items for the uicontextmenu
uimenu ( 'parent', hFig.UserData.uic, 'Label', 'do this', 'Callback', @(a,b)DoThis(hFig) )
% assign to the figure
hFig.UIContextMenu = hFig.UserData.uic;
% turn visible on and set position
hFig.UserData.uic.Visible = 'on';
hFig.UserData.uic.Position = hFig.CurrentPoint;
% uicontext menu will appear as desired
% the next mouse action is then to either select an item or
% we will capture it below
otherwise
% if the uic is stored in the userdata we need to run the clean up
% code since the user has not clicked on one of the items
if isfield ( hFig.UserData, 'uic' )
DoThis(hFig);
end
end
end
function DoThis(hFig)
% Your code
disp ( 'your code' );
% Clean up
CleanUp(hFig);
end
function CleanUp(hFig)
% delete the uicontextmenu and remove the reference to it
delete(hFig.UserData.uic)
hFig.UserData = rmfield ( hFig.UserData, 'uic' );
end