Как программно реализовать динамический графический интерфейс с флажками и полосами прокрутки?

Я пытаюсь программно создать графический интерфейс. Он должен показать следующее:

введите здесь описание изображения

где флажки справа статичны !! количество флажков слева зависит от ввода пользователя!

Я пытаюсь создать панель для динамических флажков с правой стороны и полосу прокрутки для этих панелей.

К сожалению, я совершенно не знаком с программным созданием графического интерфейса. Пока с GUIDE все работало нормально.

Я нашел хороший пример

Добавление полосы прокрутки в подзаголовки в графическом интерфейсе пользователя

для того, чтобы попасть в него с помощью осей, но я не адаптировал его для флажков :( Это моя попытка.

%# create figure, panel, and slider
w = 600; h = 500;           %# width/height of figure
handles.hFig = figure('Menubar','figure', 'Resize','off', ...
    'Units','pixels', 'Position',[200 200 w h]);
handles.hPan = uipanel('Parent',handles.hFig, ...
    'Units','pixels', 'Position',[0 0 w-20 h]);
handles.hSld = uicontrol('Parent',handles.hFig, ...
    'Style','slider', 'Enable','off', ...
    'Units','pixels', 'Position',[w-20 0 20 h], ...
    'Min',0-eps, 'Max',0, 'Value',0, ...
    'Callback',{@onSlide,handles.hPan});

%# add checkbox

hcb = zeros(7,1);
clr = lines(7);

for i=1:7

    hcb(i) = addcheckbox(handles);

    pause(1)   %# slow down so that we can see the updates

end 

Функция ползунка не изменилась. И вот самая проблемная для меня функция:

function hcb = addcheckbox(handles)
    %# look for checkboxes
    cb = findobj(handles.hPan, 'type','checkbox');

    if isempty(cb)
        %# create first checkbox

        hcb = uicontrol(handles.hFig,'Style','checkbox',...
                'String','Display file extension',...
                'Value',1,'Position',[30 20 130 20]);

    else
        %# get height of figure
        p = get(handles.hFig, 'Position');
        h = p(4);

        %# increase panel height, and shift it to show new space
        p = get(handles.hPan, 'Position');
        set(handles.hPan, 'Position',[p(1) p(2)-h p(3) p(4)+h])

%         %# compute position of new axis: append on top (y-shifted)
%         p = get(ax, 'Position');
%         if iscell(p), p = cell2mat(p); end
%         p = [p(1,1) max(p(:,2))+h p(1,3) p(1,4)];
% 
%         %# create the new axis
%         hAx = axes('Parent',handles.hPan, ...
%             'Units','pixels', 'Position',p);
% 
%         %# adjust slider, and call its callback function
%         mx = get(handles.hSld, 'Max');
%         set(handles.hSld, 'Max',mx+h, 'Min',0, 'Enable','on')
%         %#set(handles.hSld, 'Value',mx+h)       %# scroll to new space
%         hgfeval(get(handles.hSld,'Callback'), handles.hSld, []);
    end

end

Когда я выполняю его, я получаю сообщение об ошибке:

Error using findobj
Invalid handle

Error in addcheckbox (line 3)
    cb = findobj(handles.hPan, 'type','checkbox');

Эта ошибка имеет смысл, потому что у меня нет дескриптора с именем checkboxes ... в примере 'axes' - это предопределенный дескриптор, содержащийся на рисунке ... как я могу интегрировать флажки в этом контексте?


person john    schedule 24.09.2015    source источник
comment
Предоставленный код не повторяет описанную ошибку. Если ваш GUIDE GUI функционирует должным образом, зачем вы делаете программный GUI?   -  person excaza    schedule 24.09.2015
comment
Оха, ты прав! есть возможность редактировать этот вопрос? я пропустил рассмотрение вещей ... Как GUIDE может обрабатывать динамическое создание флажков? Соответствующая цифра должна быть предварительно определена, или я ошибаюсь?   -  person john    schedule 24.09.2015
comment
Да, это правильно. Однако я бы предложил одну альтернативу - использовать uitable, который можно реализовать в GUIDE и может содержать флажки. Он также выполняет прокрутку за вас. Лично я предпочитаю программный графический интерфейс, но здесь нет необходимости переделывать весь графический интерфейс.   -  person excaza    schedule 24.09.2015
comment
Большое спасибо excaza !! uitable, кажется, предоставляет все, что мне нужно!   -  person john    schedule 24.09.2015


Ответы (1)


Как упоминалось в комментариях выше, объекты uitable доступны в GUIDE и уже включить флажки и прокрутку. Хотя я определенно предпочитаю программные графические интерфейсы, я также предпочитаю не воссоздавать весь графический интерфейс, который уже функционирует :)

Вот небольшой программный пример (проще скопировать / вставить) для иллюстрации:

dummydata = {false 'Voltage Thingey 1'; ...
             false 'Voltage Thingey 2'; ...
             false 'Voltage Thingey 3' ...
             };

mytable = uitable(...
    'Data', dummydata, ...
    'ColumnEditable', [true false], ... % Allow/disallow editing of our columns
    'ColumnWidth', {'auto', 100}, ... % Width of column, in pixels
    'ColumnName', [], ... % Get rid of column headers
    'RowName', [] ...     % Get rid of row names
    );

Что дает нам:

ура!

person excaza    schedule 24.09.2015