我已将uicontextmenu
添加到线对象中。 uicontextmenu
包含3个复选框。每当我检查它们中的任何一个uicontextmenu
就会消失。我希望uicontextmenu
可见一段时间,以便我可以检查多个框并查看更改(与按钮组相同,但在uicontextmenu
中)。这个或其他方法有什么解决方案吗?
cmenu=uicontextmenu;
set(he,'uicontextmenu',cmenu);
item1=uimenu(cmenu,'label','Data A','checked','off','callback',@func_a);
item2=uimenu(cmenu,'label','Data B','checked','off','callback',@func_b);
item3=uimenu(cmenu,'label','Data C','checked','off','callback',@func_c);
基本上,he
是由plot(x,y)
创建的线对象,而func_a, func_b, func_c
是将属性'checked'
转换为on|off
的函数。
答案 0 :(得分:3)
这个例子受到了Benoit_11解决方案的极大启发,但有点精致。我的印象也是回调中的3个不同函数做了不同的事情,所以我让3个不同的菜单改变了行的不同属性(而不是用不同的值改变相同的属性)。
我在一个嵌套函数中创建了uimenu回调函数。它根据uimenu定义中提供的参数what2do
决定做什么(但可以随意保留3个独立的函数)。但请注意,切换复选标记的功能对于所有uimenu都是相同的(对于每个uimenu,您不需要单独的功能)。
function hf = TestUiContext2
%// Extension of Benoit_11 solution
clear ; clc ; close all
hf = figure ; %// return the handle of the figure
hax = axes; %// Create axes and save handle
plot(rand(20,3)); %// Plot three lines
hcmenu = uicontextmenu; %// Define a context menu; it is not attached to anything
%// Define the context menu items and install their callbacks
item1 = uimenu(hcmenu, 'Label','Bold line' , 'Callback' , {@uiCallback,'bold'} );
item2 = uimenu(hcmenu, 'Label','Dotted line' , 'Callback' , {@uiCallback,'dots'} );
item3 = uimenu(hcmenu, 'Label','Markers on' , 'Callback' , {@uiCallback,'mark'} );
hlines = findall(hax,'Type','line'); %// Locate line objects
for line = 1:length(hlines) %// Attach the context menu to each line
set(hlines(line),'uicontextmenu',hcmenu)
end
function uiCallback(obj,~,what2do)
hline = gco ;
switch what2do
case 'bold'
toggle_bold_line(hline)
case 'dots'
toggle_dotted_line(hline)
case 'mark'
toggle_markers(hline)
end
%// reposition the context menu and make it visible
set(hcmenu,'Position',get(gcf,'CurrentPoint'),'Visible','on')
toggle_checkmark(obj) %// toggle the checkmark
end
function toggle_checkmark(obj)
if strcmp(get(obj,'Checked'),'on')
set(obj,'Checked','off')
else
set(obj,'Checked','on')
end
end
function toggle_bold_line(hline)
if get(hline,'LineWidth')==0.5
set(hline,'LineWidth',2)
else
set(hline,'LineWidth',0.5)
end
end
function toggle_dotted_line(hline)
if strcmpi(get(hline,'LineStyle'),':')
set(hline,'LineStyle','-')
else
set(hline,'LineStyle',':')
end
end
function toggle_markers(hline)
if strcmpi(get(hline,'Marker'),'none')
set(hline,'Marker','o')
else
set(hline,'Marker','none')
end
end
end
现在,您可以一次性浏览所有菜单;)
答案 1 :(得分:1)
这是一个可能为您解决问题的解决方法。这不太优雅但似乎有用。
诀窍是设置菜单' Visible
'财产到' on
'在你的每个回调中(即@ func_a,@ funct_b和@funct_c)。当我运行以下示例时(基于Mathworks网站上的演示),当选择更改时,菜单不会消失。请注意,我为每个回调创建了单独的函数。
以下是代码:
function TestUiContext( ~)
%// Based on example from The Mathworks
%// http://www.mathworks.com/help/matlab/ref/uicontextmenu.html
clear
clc
close all
%// Create axes and save handle
hax = axes;
%// Plot three lines
plot(rand(20,3));
%// Define a context menu.
hcmenu = uicontextmenu;
%// Define the context menu items and install their callbacks
item1 = uimenu(hcmenu,'Label','dashed','Callback',@(s,e) hcb1);
item2 = uimenu(hcmenu,'Label','dotted','Callback',@(s,e) hcb2);
item3 = uimenu(hcmenu,'Label','solid','Callback',@(s,e) hcb3);
%// Locate line objects
hlines = findall(hax,'Type','line');
%// Attach the context menu to each line
for line = 1:length(hlines)
set(hlines(line),'uicontextmenu',hcmenu)
end
%// In the callback of every item/option, set the menu property 'Visible' to 'on'.
function hcb1
set(gco,'LineStyle','--');
set(hcmenu,'Visible','on')
end
function hcb2
set(gco,'LineStyle',':');
set(hcmenu,'Visible','on')
end
function hcb3
set(gco,'LineStyle','-');
set(hcmenu,'Visible','on')
end
end
2个屏幕截图显示它的样子:
向下移动光标:
正如我所说,并不完美,但希望它会为你做好工作!