Сделать панель со значениями видимыми, когда я нажимаю радиокнопку
У меня есть uibuttongroup с определенными в ней переключателями. У меня есть uipanels, определенные с их соответствующими свойствами. То, что я хочу сделать, - это иметь возможность щелкнуть по одной радиокнопке, чтобы появилась одна uipanel, а затем щелкнуть по моей другой радиокнопке, чтобы появилась другая uipanel. Вот фрагменты моего кода:
operation_type_1 = uibuttongroup(S.Test, 'Title', 'Operation Type', 'position', [0 0.3 panel_w/2 0.15]);
uicontrol('Parent',operation_type_1, 'Style', 'radiobutton',...
'String', 'invisible',...
'position', [0 0 0 0], 'Tag', 'invisibutton');
uicontrol('Parent',operation_type_1,'Style','radiobutton',...
'String', 'Time Operation',...
'Position', 100*[0.1 flooring(3.5, 'tp') 1.2 0.15], 'Tag', 'timeop1');
uicontrol('Parent',operation_type_1,'Style','radiobutton',...
'String', 'Volume Operation',...
'Position', 100*[0.1 flooring(2.5, 'tp') 1.2 0.15], 'Tag', 'volumeop1');
Это определяет мою группу кнопок и две кнопки-переключатели.
Тогда у меня есть код, который создает панель громкости:
А также панель времени:
Они в одинаковом положении. Я хочу иметь возможность щелкнуть радиокнопку "Time Operation", чтобы панель времени была видна, а когда я нажимаю радиокнопку "Volume Operation", панель громкости видна.
Я пытался делать заявления о смене регистра. Я не получаю ошибок, но я тоже не получаю результатов. Например, мои примеры для панелей времени и объема:
switch str
case 'timeop1'
if U.Value; S.result_panel_time1.Visible = 'On';
else S.result_panel_time1.Visible = 'Off';
end
case 'volumeop1'
if U.Value; S.result_panel_volume1.Visible = 'On';
else S.result_panel_volume1.Visible = 'Off';
end
Как мне заставить это работать? Я не использую GUIDE, просто кодирую графический интерфейс MATLAB.
ОБНОВИТЬ
Я попытался реализовать обратный вызов, предложенный ниже, но получаю "Определение функции неуместно или неправильно вложено". ошибка. Я использую следующую функцию:
function button_callback(U, varargin{2})
switch get(get(operation_type_1, 'SelectedObject'), 'Tag')
case 'timeop1'
if U.Value; S.result_panel_time1.Visible = 'On';
else S.result_panel_time1.Visible = 'Off';
end
case 'volumeop1'
if U.Value; S.result_panel_volume1.Visible = 'On';
else S.result_panel_volume1.Visible = 'Off';
end
end
end
И я добавил обратные вызовы "...'callback', {@pb_call, S}" к моим timeop1 и volumeop1. (Потому что все остальные мои функции находятся в.m файле с именем pb_call.m). Функция выглядит хорошо вложенной, но ошибка указывает на точную.
2 ответа
Мне кажется, вы не определили обратный вызов для вашего RadioButton. Например, установите обратный вызов для volumeop1:
uicontrol('Parent',operation_type_1,'Style','radiobutton',...
'String', 'Volume Operation',...
'Position', 100*[0.1 0.3 1.2 0.15], 'Tag', 'volumeop1', ...
'Callback', @switchPanel);
Затем в функции switchPanel вы установите соответствующую панель видимой, а другие - невидимой.
Это пытается ответить на ваши вопросы, но мне кажется, что вы хотите Uitab.
Мой партнер все исправил:
Обратный вызов был {callback, S}, а S, U и str были:
S = varargin{3}; %main figure handle
U = varargin{1}; %current uicontrol
str = char(U.String);
Проблема возникла при создании радиокнопки, поскольку панели результатов создавались после запуска радиокнопок, поэтому ничего не было сделано невидимым / видимым, и произошла ошибка.
Однако было бы очень удобно, если бы обратные вызовы могли влиять на все части графического интерфейса, а не только на ранее определенные. Я пытался использовать guidata в прошлом, но мне приходилось использовать другие, менее простые методы для достижения моих целей. Я постараюсь использовать рабочие образцы и опираться на них в будущем, но в настоящее время я работаю над другой частью проекта и вернусь к этому позже.
Но использование либо guidata/setappdata, либо чего-то связанного с этим подойдет мне и моему собственному решению, которое гарантирует, что объекты, которые вы пытаетесь изменить, уже определены до нажатия кнопки, вызывающей обратный вызов.
(Он также опубликовал этот ответ там, где я задавал этот же вопрос в ответах MATLAB.)