2012-05-26 3 views
0

Я пытаюсь, что @Amro предложил мне, и я изменил часть кода, и я получил некоторые ошибки:/MATLAB GUI радиокнопки

пожалуйста, помогите мне.

Я установил параметры, чтобы быть:

options = { 
    {'r','g','b','c','m','y','k'} ; 
    {'x','o','.','s'} ; 
    {'1','2','3'} ; 
    {'2','3'} ; 
    {'1','3'} ; 
    {'1','2'} 
}; 

теперь, я написал в MATLAB:

mainGUI(options) 

и я получил эти ошибки:

??? Index exceeds matrix dimensions. 

Error in ==> tmp>secondaryGUI at 67 
     if strcmp(selected{i},options{i}{j}) 

Error in ==> tmp>callback at 17 
    hOptsGUI = secondaryGUI(hFig); 

??? Error while evaluating uicontrol Callback 

Это код:

function mainGUI(options) 
    %# current options 
    opts = {'r', '.', '1'}; 

    %# create main figure, with plot and options button 
    hFig = figure; 
    callback 

    %# options button callback function 
    function callback(o,e) 
     %# save current options (sharing data between the two GUIs) 
     setappdata(hFig, 'opts',opts); 

     %# display options dialog and wait for it 
     hOptsGUI = secondaryGUI(hFig, options); 
     waitfor(hOptsGUI); 

     %# get new options, and update plot accordingly 
     opts = getappdata(hFig, 'opts'); 
     opts 
    end 
end 

function hFig = secondaryGUI(hParentFig, options) 
    %# create figure 
    hFig = figure('Menubar','none', 'Resize','off', ... 
    'WindowStyle','modal', 'Position',[100 100 350 200]); 
    movegui(hFig, 'center'); 

    %# all possible plot options 

    options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false); 
    num = length(options); 

    %# get saved settings 
    selected = getappdata(hParentFig, 'opts'); 

    %# top/bottom panels 
    hPanBot = uipanel('Parent',hFig, 'BorderType','none', ... 
    'Units','normalized', 'Position',[0 0.0 1 0.2]); 
    hPanTop = uipanel('Parent',hFig, 'BorderType','none', ... 
    'Units','normalized', 'Position',[0 0.2 1 0.8]); 

    %# buttongroups in top panel 
    hBtnGrp = zeros(1,num); 
    width = 1/num; 
    for i=1:num 
     %# create button group 
     hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ... 
      'Units','normalized', 'Position',[(i-1)*width 0 width 1]); 
     %# populate it with radio buttons 
     height = 1./numel(options{i}); 
     for j=1:numel(options{i}) 
      h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ... 
      'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ... 
      'String',options{i}{j}); 
      %# set initially selected values 
      if strcmp(selected{i},options{i}{j}) 
       set(hBtnGrp(i), 'SelectedObject',h) 
      end 
     end 
    end 

    %# save button in bottom panel 
    uicontrol('Parent',hPanBot, 'Style','pushbutton', ... 
     'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ... 
     'String','start', 'Callback',@callback) 

    %# save button callback function 
    function callback(o,e) 
     %# get selected values 
     hObjs = get(hBtnGrp(:), 'SelectedObject'); 
     vals = get(cell2mat(hObjs),{'String'}); 

     %# update settings 
     setappdata(hParentFig, 'opts',vals); 

     %# close options dialog 
     close(hFig) 
    end 
end 

Возможно, существует проблема с переменной «opts», потому что нет значений: {'r', '.', '1'}?

, потому что я не знаю, почему она превышает размеры матрицы, длина вариантов 6.

спасибо!

ответ

1

Если я правильно понял это, вы разрабатываете графический интерфейс, который позволяет пользователю устанавливать некоторые параметры и возвращать выбранные параметры.

Вместо того, чтобы возвращать значение сразу, как вы делаете сейчас, вы можете использовать GETAPPDATA/SETAPPDATA в качестве механизма совместного использования данных.

Что касается макета, используйте panels для объединения компонентов вместе, это позволяет использовать более гибкие графические интерфейсы.

Вот пример приложения для иллюстрации. Идея состоит в том, что у нас есть основная фигура, содержащая сюжет, и мы предоставляем второй «диалог» для настройки параметров сюжета.

function mainGUI() 
    %# current options 
    opts = {'r', '.', '1'}; 

    %# create main figure, with plot and options button 
    hFig = figure; 
    hLine = plot(cumsum(rand(100,1)-0.5), ... 
     'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3})); 
    uicontrol('Style','pushbutton', 'String','Options...', 'Callback',@callback) 

    %# options button callback function 
    function callback(o,e) 
     %# save current options (sharing data between the two GUIs) 
     setappdata(hFig, 'opts',opts); 

     %# display options dialog and wait for it 
     hOptsGUI = secondaryGUI(hFig); 
     waitfor(hOptsGUI); 

     %# get new options, and update plot accordingly 
     opts = getappdata(hFig, 'opts'); 
     set(hLine, 'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3})) 
    end 
end 

function hFig = secondaryGUI(hParentFig) 
    %# create figure 
    hFig = figure('Menubar','none', 'Resize','off', ... 
     'WindowStyle','modal', 'Position',[100 100 350 200]); 
    movegui(hFig, 'center'); 

    %# all possible plot options 
    options = { 
     {'r','g','b','c','m','y','k'} ; %# color 
     {'x','o','.','s'} ;    %# shape 
     {'1','2','3'}      %# width 
    }; 
    options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false); 
    num = length(options); 

    %# get saved settings 
    selected = getappdata(hParentFig, 'opts'); 

    %# top/bottom panels 
    hPanBot = uipanel('Parent',hFig, 'BorderType','none', ... 
     'Units','normalized', 'Position',[0 0.0 1 0.2]); 
    hPanTop = uipanel('Parent',hFig, 'BorderType','none', ... 
     'Units','normalized', 'Position',[0 0.2 1 0.8]); 

    %# buttongroups in top panel 
    hBtnGrp = zeros(1,num); 
    width = 1/num; 
    for i=1:num 
     %# create button group 
     hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ... 
      'Units','normalized', 'Position',[(i-1)*width 0 width 1]); 
     %# populate it with radio buttons 
     height = 1./numel(options{i}); 
     for j=1:numel(options{i}) 
      h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ... 
       'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ... 
       'String',options{i}{j}); 
      %# set initially selected values 
      if strcmp(selected{i},options{i}{j}) 
       set(hBtnGrp(i), 'SelectedObject',h) 
      end 
     end 
    end 

    %# save button in bottom panel 
    uicontrol('Parent',hPanBot, 'Style','pushbutton', ... 
     'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ... 
     'String','Save & Close', 'Callback',@callback) 

    %# save button callback function 
    function callback(o,e) 
     %# get selected values 
     hObjs = get(hBtnGrp(:), 'SelectedObject'); 
     vals = get(cell2mat(hObjs),{'String'}); 

     %# update settings 
     setappdata(hParentFig, 'opts',vals); 

     %# close options dialog 
     close(hFig) 
    end 
end 

screenshot

+0

Привет и спасибо за ваш комментарий, но это не то, что мне нужно именно:/Я пытался спросить его снова, так что вы можете еще раз прочитать мой вопрос, пожалуйста? http://stackoverflow.com/questions/10775243/matlab-gui-buttons –

+0

@AlonShmiel: Другой вопрос почти идентичен, и я до сих пор не понимаю, что вы хотите делать (всегда [спрашивать] (http: //stackoverflow.com/questions/how-to-ask) конкретные вопросы) ... Я попытался решить все проблемы, о которых вы говорили. Поэтому, если ничего другого, изучите код выше и, возможно, вы получите представление об этом решении. Я старался прокомментировать каждый шаг, поэтому его следует легко следовать. – Amro

+0

Привет, я попробовал то, что вы мне предложили. Мне просто нужно окно «Рисунок 2», поэтому я удаляю окно «Рисунок 1». Я меняю свой новый вопрос. Если сможешь, пожалуйста, помогите мне. большое спасибо, Алон. –