2015-07-11 4 views
0

У меня есть форма sipmle с двумя переключателями. Изменяя выбор я хотел бы выполнить код в функции обратного вызоваПолучение обратного вызова от радиомаяка в Matlab

Exaple project with radiobuttons

Вот мой пример кода, который не работает:

classdef radioexample < handle 
    %radioexample2 
    % example for radiobuttons 


    properties(Hidden) 
     % all elements of the GUI are properties of the class trechner 
     formMain; % "The MainWindow" 
     menuFile; % "The Menu Header" 

     % radio items 
     radiogroup 
     radio1 
     radio2 

    end 

    methods(Hidden) 
     function obj = radioexample 
      % Constructor Form Main 
      obj.formMain = figure('position',[400,400,600,260],'Visible','off'); 
      set(obj.formMain,'Name','Radioexample','NumberTitle','off',... 
       'MenuBar','none','Resize','Off'); 

      % a menu for exit the program    
      obj.menuFile.main = uimenu('Label','File');    
      obj.menuFile.exit = uimenu(obj.menuFile.main,... 
       'Label','Exit','Callback',{@obj.close_Callback,obj}); 

      % radiobutton to select the mode 
      obj.radiogroup = uibuttongroup(obj.formMain,... 
       'Visible','on',... 
       'Units','pixels',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'Position',[220 80 100 100]); 
       %'SelectionChangedFcn',@obj.bselection); 
      uicontrol(obj.radiogroup,... 
       'Style',... 
       'radiobutton',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'String','Option 1',... 
       'Position',[10 70 70 20],... 
       'Callback',{@obj.opt1_Callback,obj},... 
       'HandleVisibility','off'); 
      uicontrol(obj.radiogroup,... 
       'Style',... 
       'radiobutton',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'String','Option 2',... 
       'Position',[10 50 70 20],... 
       'Callback',{@obj.opt2_Callback,obj},... 
       'HandleVisibility','off');  

      set(obj.formMain,'Visible','on'); 
     end 

    end 

    methods(Static,Access=private)    
     function close_Callback(~,~,obj) 
      % close window 
      close(obj.f) 
     end 

     function opt1_Callback(~) 
      fprintf('switched to radio1 mode'); %Does not work 
     end 

     function opt2_Callback(~) 
      fprintf('switched to radio2 mode'); %Does not work 
      msgbox('switched to radio2 mode','Success'); %Does not work 
     end 

    end 

    methods(Access=public,Hidden) 
     function disp(obj) 
     end 
    end 
end 

Функция обратного вызова не получает казнены/называется ,

ответ

2

Это относительно легко исправить. Просто сделайте следующие перестановки в uicontrol -линии:

'Callback',@obj.opt1_Callback,... 

и

'Callback',@obj.opt2_Callback,... 

Функции обратного вызова требуется два входных аргумент. Первый - это uicontrol, а второй - eventdata. Если вам не нужны входные аргументы, просто добавьте еще один ~ так:

function opt1_Callback(~,~) 
    fprintf('switched to radio1 mode'); 
end 

и

function opt2_Callback(~,~) 
    fprintf('switched to radio2 mode'); 
    msgbox('switched to radio2 mode','Success'); 
end 

Другой способ заключается в использовании SelectionChangedFcn -callback в uibuttongroup, как это:

classdef radioexample < handle 
    %radioexample2 
    % example for radiobuttons 


    properties(Hidden) 
     % all elements of the GUI are properties of the class trechner 
     formMain; % "The MainWindow" 
     menuFile; % "The Menu Header" 

     % radio items 
     radiogroup 
     radio1 
     radio2 

    end 

    methods(Hidden) 
     function obj = radioexample 
      % Constructor Form Main 
      obj.formMain = figure('position',[400,400,600,260],'Visible','off'); 
      set(obj.formMain,'Name','Radioexample','NumberTitle','off',... 
       'MenuBar','none','Resize','Off'); 

      % a menu for exit the program    
      obj.menuFile.main = uimenu('Label','File');    
      obj.menuFile.exit = uimenu(obj.menuFile.main,... 
       'Label','Exit','Callback',{@obj.close_Callback,obj}); 

      % radiobutton to select the mode 
      obj.radiogroup = uibuttongroup(obj.formMain,... 
       'Visible','on',... 
       'Units','pixels',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'Position',[220 80 100 100],... 
       'SelectionChangedFcn',@obj.bselection); 
      uicontrol(obj.radiogroup,... 
       'Style',... 
       'radiobutton',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'String','Option 1',... 
       'Position',[10 70 70 20],... 
       'HandleVisibility','off'); 
      uicontrol(obj.radiogroup,... 
       'Style',... 
       'radiobutton',... 
       'BackGroundColor',[0.8 0.8 0.8],... 
       'String','Option 2',... 
       'Position',[10 50 70 20],... 
       'HandleVisibility','off');  

      set(obj.formMain,'Visible','on'); 
     end 

     function bselection(source,~,callbackdata) 
      switch callbackdata.NewValue.String 
       case 'Option 1' 
        radioexample.opt1_Callback(source,callbackdata); 
       case 'Option 2' 
        radioexample.opt2_Callback(source,callbackdata); 
      end 
     end 

    end 

    methods(Static,Access=private)    
     function close_Callback(~,~,obj) 
      % close window 
      close(obj.f) 
     end 

     function opt1_Callback(~,~) 
      fprintf('switched to radio1 mode'); 
     end 

     function opt2_Callback(~,~) 
      fprintf('switched to radio2 mode'); 
      msgbox('switched to radio2 mode','Success'); 
     end 

    end 

    methods(Access=public,Hidden) 
     function disp(obj) 
     end 
    end 
end 
+0

Я изменил его на ваше решение, но fprintfs не выполняются, когда я меняю выбор радио. – kimliv

+0

@kimliv: В аргументах была ошибка, и она исправлена. Он должен был работать до любого момента. – Matt

+0

Вы проверили его? Для меня это не работает. – kimliv

Смежные вопросы