【问题标题】:Make a panel with values visible when I press a radiobutton当我按下单选按钮时,使面板的值可见
【发布时间】:2017-07-07 04:36:40
【问题描述】:

我有一个 uibuttongroup,其中定义了单选按钮。我定义了带有相应属性的 uipanels。我想要做的是能够单击一个单选按钮并出现一个 uipanel,然后单击我的另一个单选按钮以显示另一个 uipanel。这是我的代码的 sn-ps:

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');

这定义了我的按钮组和两个单选按钮。

然后我有创建音量面板的代码:

还有一个时间面板:

它们处于相同的位置。我想要的是能够单击“时间操作”单选按钮并使时间面板可见,当我单击“音量操作”单选按钮时,音量面板可见。

我尝试过使用 switch case 语句。我没有得到错误,但我也没有得到结果。例如,我对时间和音量面板的案例陈述是:

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 GUI。

更新

我已尝试实现下面建议的回调,但我收到“函数定义放错位置或嵌套不正确”。错误。我使用以下功能:

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。 (因为我拥有的所有其他功能都在一个名为 pb_call.m 的 .m 文件中)。该函数似乎嵌套得很好,但错误指向的正是那个。

【问题讨论】:

    标签: matlab user-interface


    【解决方案1】:

    在我看来,您没有为 RadioButton 定义 callback。例如为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

    【讨论】:

    • 我更新了我的问题,说明我是如何实施您的建议的。你能建议一个修复吗?如果这能解决问题,我很乐意接受您的回答。
    【解决方案2】:

    我的搭档最终修复了它:

    回调是 {callback, S} 而 S、U 和 str 是:

    S = varargin{3}; %main figure handle
    U = varargin{1}; %current uicontrol
    str = char(U.String);
    

    问题出现在单选按钮的创建中,因为结果面板是在单选按钮被触发后创建的,因此没有任何东西是不可见/可见的,并且会发生错误。

    但是,如果回调可以影响所有 GUI 部分,而不仅仅是先前定义的部分,那将非常方便。我过去曾尝试使用 guidata,但我不得不使用其他不那么直接的方法来实现我的目标。将来我会尝试使用工作示例并在这些示例的基础上进行构建,但目前我正在处理该项目的另一部分,稍后再讨论。

    但是使用 guidata/setappdata 或相关的东西在这里以及我自己的解决方案都可以工作,这是确保您尝试更改的对象在按钮触发回调之前已经定义。

    (他还将这个答案发布到我在 MATLAB Answers 中提出同样问题的地方。)

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2020-02-11
      • 2012-10-05
      • 2019-08-10
      相关资源
      最近更新 更多