0

以下代码创建 3 个单选按钮。选择功能确保显示适当的内容:

function myui
bg = uibuttongroup('Visible','off',...
                  'Position',[0 0 .2 1],...
                  'SelectionChangedFcn',@bselection);

% Create three radio buttons in the button group.
r1 = uicontrol(bg,'Style','radiobutton',...
                  'String','Option 1',...
                  'Position',[10 350 100 30],...
                  'HandleVisibility','off');

r2 = uicontrol(bg,'Style','radiobutton',...
                  'String','Option 2',...
                  'Position',[10 250 100 30],...
                  'HandleVisibility','off');

r3 = uicontrol(bg,'Style','radiobutton',...
                  'String','Option 3',...
                  'Position',[10 150 100 30],...
                  'HandleVisibility','off');

% Make the uibuttongroup visible after creating child objects. 
bg.Visible = 'on';

    function bselection(source,callbackdata)
       display(['Previous: ' callbackdata.OldValue.String]);
       display(['Current: ' callbackdata.NewValue.String]);
       display('------------------');
    end
end

我想更改每个代码显示的选择和内容(没有用户点击)。我可以将每个代码的单选按钮选择设置为:

set(bg, 'SelectedObject', r2);

这将为正确的单选按钮绘制蓝点(似乎已选中),但是未显示正确的内容。我想我需要手动调用'SelectionChangedFcn',我不能,因为它要求'callbackdata',这是一个'matlab.ui.eventdata.SelectionChangedData'类,还没有文档。

问题:在编码单选按钮更改时,我是否需要自己创建“回调数据”以“从外部”调用 SelectionChangedFcn,还是有其他方法?

问题2:我会就“HandleVisibility”为什么/何时有用或没有用的一个小提示,MatLab 文档对我来说太神秘了。

4

1 回答 1

0

首先,关于问题 2:如果您将属性设置HandleVisibilityoff单选按钮,您将无法在uibuttongroup.

例如,使用HandleVisibilityto off

bg.Children

ans = 

  0x0 empty GraphicsPlaceholder array.

并与HandleVisibilityto on

bg.Children

ans = 

  3x1 UIControl array:

  UIControl    (Option 3)
  UIControl    (Option 2)
  UIControl    (Option 1)

这取决于您希望如何访问您的单选按钮。

关于以编程方式调用 Callback 函数,我建议您编写自己的 Callback 函数,而不是使用SelectionChangedFcn(在这种情况下,您必须设置HandleVisibilityon)。这个解决方案对我有用:

function myui

    figure
    bg = uibuttongroup('Visible','off',...
                      'Position',[0 0 .2 1]);

    % Create three radio buttons in the button group.
    r1 = uicontrol(bg,'Style','radiobutton',...
                      'String','Option 1',...
                      'Position',[10 350 100 30],...
                      'HandleVisibility','on');

    r2 = uicontrol(bg,'Style','radiobutton',...
                      'String','Option 2',...
                      'Position',[10 250 100 30],...
                      'HandleVisibility','on');

    r3 = uicontrol(bg,'Style','radiobutton',...
                      'String','Option 3',...
                      'Position',[10 150 100 30],...
                      'HandleVisibility','on');

    % Make the uibuttongroup visible after creating child objects. 
    bg.Visible = 'on';

    % Use here your own way to switch the buttons, I use a simple vector as a counter
    CounterToSelect = [1 2 3 1 2 3 1 2 3];
    for k=1:length(CounterToSelect);
        pause(1)
        previousChild = bg.SelectedObject;
        selectedChild = bg.Children(CounterToSelect(k));
        bg.SelectedObject = selectedChild;
        DisplayInfoChildren(previousChild, selectedChild);
    end

end

function DisplayInfoChildren(previousChild, selectedChild)
    display(['Previous: ' previousChild.String]);
    display(['Current: ' selectedChild.String]);
    display('------------------');
end
于 2017-01-17T08:51:21.600 回答