2015-01-12 13 views
3

Я добавил uicontextmenu к объекту линии. uicontextmenu включает 3 флажка. всякий раз, когда я проверю любой из них, uicontextmenu исчезает. Я хочу, чтобы uicontextmenu был видимым на некоторое время, чтобы я мог проверять несколько ящиков и видеть изменение (то же, что и группа кнопок, но в uicontextmenu). Есть ли какое-либо решение для этого или другого подхода?Как предотвратить исчезновение uimenu (MATLAB) после проверки

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.

ответ

3

Этот пример очень вдохновлен решением Benoit_11, но немного усовершенствован. У меня также создалось впечатление, что три разные функции в вашем обратном вызове делали разные вещи, поэтому я сделал 3 разных меню, изменяя разные свойства линии (вместо того, чтобы изменять одно и то же свойство с разными значениями).

Я сделал обратный вызов uimenu в одной вложенной функции. Он решает, что делать на основе параметра what2do, предоставленного в определении uimenu (но не стесняйтесь хранить 3 отдельные функции). Однако обратите внимание, что функция, которая переключает галочку, одинакова для всех 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 

Теперь вы можете наслаждаться тикают все свое меню на одном дыхании;) uicontextexample

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 скриншоты, чтобы показать, как он выглядит:

enter image description here

И перемещая курсор вниз:

enter image description here

Как я уже сказал, не p но надеемся, что это сработает для вас!

+0

Nice один, и вы можете также изменить положение меню, а также сделать его видимым: 'набор (hcmenu,«Позиция» , get (gcf, 'CurrentPoint'), 'Visible', 'on') 'поэтому он появляется в той же позиции;) – Hoki

+0

Да, я подумал об этом @Hoki, но я использовал get (0, 'PointerLocation') и он не работал, поэтому я сдался и лег спать ха-ха :). Хорошее решение на вашей стороне +1! –

+0

Это может сработать, но с обходом. 'get (0, 'PointerLocation')' вернуть позицию "на экране". Тогда вам придется перевести это в координаты фигуры. – Hoki