2016-07-10 9 views
0

Следующий код создает 3 радиообъектива. Функция выбора гарантирует, что соответствующее содержание показано:Matlab R2015b Выбор радиолюбителя по коду

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 

Я хотел бы, чтобы изменить выбор И содержание, показанное за код (пользователь не щелкает). можно установить выбор RadioButton на код, как:

set(bg, 'SelectedObject', r2); 

Это рисует синюю точку для правильного RadioButton (кажется выбран), однако, правильное содержание не показано. Я предполагаю, что мне нужно вызвать «SelectionChangedFcn» вручную, чего я не могу, поскольку он требует от «callbackdata», который является классом «matlab.ui.eventdata.SelectionChangedData» без документации.

Вопрос: Должен ли я сам создать callbackdata для вызова SelectionChangedFcn 'снаружи' при кодировании изменения радиообмена или есть другой способ?

Вопрос2: Я бы набросал крошечный намек на то, почему/когда «HandleVisibility» полезна или нет, документация MatLab слишком загадочна для меня.

ответ

0

Во-первых, о вопросе 2: Если вы установили свойство HandleVisibility на off на радиокнопках, у вас не будет доступа к ручкам его в ручке uibuttongroup.

В качестве примера, с HandleVisibility в off:

bg.Children 

ans = 

    0x0 empty GraphicsPlaceholder array. 

И HandleVisibility к on:

bg.Children 

ans = 

    3x1 UIControl array: 

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

Это зависит от того, как вы хотите получить доступ к вашим радиокнопкам.

О программно позвонить в функции обратного вызова, я предлагаю вам код своей собственной функции обратного вызова вместо использования SelectionChangedFcn (Вы будете иметь в этом случае, чтобы установить HandleVisibility к on). Это решение работает для меня:

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