Вернуть выделенное меню в MATLAB, используя одну строку кода - PullRequest
5 голосов
/ 03 мая 2010

У меня есть графический интерфейс, который использует выбор из всплывающего меню в другом обратном вызове. Есть ли способ вернуть выбранное значение всплывающего меню только в одной строке без создания каких-либо временных переменных? Я пробовал несколько решений, но я управлял только двумя строками с одной временной переменной:

Три строки:

list=get(handles.popupmenu1,'String');
val=get(handles.popupmenu1,'Value');
str=list{val};

Две строки:

temp=get(handles.popupmenu1,{'String','Value'});
str=temp{1}{temp{2}};

Кто-нибудь может побрить его до одного?

PS, это динамическое меню, поэтому я не могу просто использовать get(handles.popupmenu1,'Value') и вообще игнорировать строковый компонент.

Ответы [ 3 ]

11 голосов
/ 03 мая 2010

Вот одна строка:

str = getCurrentPopupString(handles.popupmenu1);

А вот определение getCurrentPopupString

function str = getCurrentPopupString(hh)
%# getCurrentPopupString returns the currently selected string in the popupmenu with handle hh

%# could test input here
if ~ishandle(hh) || strcmp(get(hh,'Type'),'popupmenu')
error('getCurrentPopupString needs a handle to a popupmenu as input')
end

%# get the string - do it the readable way
list = get(hh,'String');
val = get(hh,'Value');
if iscell(list)
   str = list{val};
else
   str = list(val,:);
end

Я знаю, что это не тот ответ, который вы искали, но он действительно отвечает на заданный вами вопрос:)

5 голосов
/ 04 мая 2010

Я знаю, что это глупо, но я не смог устоять:

list=get(handles.popupmenu1,'String'); str=list{get(handles.popupmenu1,'Value')};

Я знаю, это не то, что вы имели в виду, но, как и другие ответы выше, это действительно отвечает на ваш вопрос ...

5 голосов
/ 03 мая 2010

Чтобы сделать его однострочным, я просто создал бы свою собственную функцию (т.е. getMenuSelection), как Jonas в своем ответе. Если вы действительно хотите по-настоящему однострочно, вот тот, который использует CELLFUN :

str = cellfun(@(a,b) a{b},{get(handles.popupmenu1,'String')},{get(handles.popupmenu1,'Value')});

Очень ужасно и трудно читать. Я определенно хотел бы написать свою собственную функцию.

РЕДАКТИРОВАТЬ: И вот немного короче (но все равно одинаково уродливым) однострочник с использованием FEVAL :

str = feval(@(x) x{1}{x{2}},get(handles.popupmenu1,{'String','Value'}));
...