Сделать панель со значениями видимыми, когда я нажимаю радиокнопку

У меня есть 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.)

Другие вопросы по тегам