Tabs optimisés dans L'interface graphique MATLAB

je travaille dans une interface graphique à MATLAB et j'utilise des onglets pour organiser l'information. Comme les onglets ne sont pas pris en charge dans MATLAB GUIDE, je n'en crée que plusieurs uipanels et de changer leur 'Visible' champ. Toutefois, lorsque le nombre de contrôles à l'intérieur de chaque panneau est grand, il faut un certain temps pour basculer entre les panneaux. Est-ce que quelqu'un sait comment rendre tab commutateur plus rapide?

j'inclus un exemple simple de l'onglet basé interface.

tab_example_gui.m

% Figure
handles.figure_window = figure(...
    'Units','characters',...
    'Tag','figure_window',...
    'Position',[50 50 80 25],...
    'Name','Tab Example',...
    'DockControls','off',...
    'IntegerHandle','off',...
    'MenuBar','none',...
    'NumberTitle','off',...
    'Resize','off');

% Buttons
handles.tab_panel = uibuttongroup(...
    'Parent',handles.figure_window,...
    'Tag','tab_panel',...
    'Units','characters',...
    'Position',[0 23 80 2],...
    'SelectionChangeFcn',@(hObject,eventdata)tab_example_callback(hObject,eventdata,guidata(hObject)),...
    'BorderType','none');
handles.tab_a = uicontrol(...
    'Parent',handles.tab_panel,...
    'Tag','tab_a',...
    'Units','characters',...
    'Position',[0 0 40 2],...
    'Style','togglebutton',...
    'String','Tab A');
handles.tab_b = uicontrol(...
    'Parent',handles.tab_panel,...
    'Tag','tab_b',...
    'Units','characters',...
    'Position',[40 0 40 2],...
    'Style','togglebutton',...
    'String','Tab B');


% Panel A
handles.panel_a = uipanel(...
    'Parent',handles.figure_window,...
    'Tag','panel_menu',...
    'Units','characters',...
    'Position',[0.1 0 79.8 23],...
    'Visible','On');
handles.panel_a_text = uicontrol(...
    'Parent',handles.panel_a,...
    'Tag','panel_menu_load_id_text',...
    'Units','characters',...
    'Position',[0 0 77 22],...
    'Style','text',...
    'String','This is the tab A');

% Panel B
handles.panel_b = uipanel(...
    'Parent',handles.figure_window,...
    'Tag','panel_menu',...
    'Units','characters',...
    'Position',[0.1 0 79.8 23],...
    'Visible','Off');
handles.panel_b_text = uicontrol(...
    'Parent',handles.panel_b,...
    'Tag','panel_menu_load_id_text',...
    'Units','characters',...
    'Position',[0 0 77 22],...
    'Style','text',...
    'String','This is the tab B');

guidata(handles.figure_window, handles);

tab_example_callback.m

function tab_example_callback(hObject,eventdata,handles)
    switch get(get(hObject,'SelectedObject'),'Tag')
        case 'tab_a', set(handles.panel_a,'Visible','On'); set(handles.panel_b,'Visible','Off');
        case 'tab_b', set(handles.panel_a,'Visible','Off'); set(handles.panel_b,'Visible','On');
    end
    guidata(handles.figure_window, handles);
end

Note: L'interface graphique doit introduire des paramètres pour une simulation en 5 onglets. Dans chaque onglet, j'ai environ 15 lignes, et chaque ligne a un text, un checkbox et de trois edits. Il n'a pas l'air surpeuplées pour moi. En outre, j'ai fait la disposition et les rappels sur mon propre avec le montant minimum de code et de frais généraux. Mais, il a encore très les transitions d'onglets ennuyants.

14
demandé sur Andras Deak 2013-02-04 18:02:50

3 réponses

peut-être si vous mettez les poignées dans un tableau. De cette façon, vous n'avez pas à passer par chacun d'eux. Cela semble rapide pour moi, mais "rapide" peut signifier beaucoup de choses :)

j'ai enlevé certaines propriétés pour rendre l'exemple plus courte...

function test(N) % N is the number of tabs
if nargin == 0
    N = 3;
end

% Figure
handles.figure_window = figure(...
    'Units','characters',...
    'Position',[50 50 80 25]);
% Buttons
handles.tab_panel = uibuttongroup(...
    'Parent',handles.figure_window,...
    'Units','characters',...
    'Position',[0 23 80 2]);

alpha = 'ABCDEFGHIJKLMNOPQRSTUVXYZ';
for i_tab=1:N
    % button
    handles.tabs(i_tab) = uicontrol(...
        'Parent',handles.tab_panel,...
        'Units','characters',...
        'Position',[80/N*(i_tab-1) 0 80/N 2],...
        'Style','togglebutton',...
        'String',['Tab ' alpha(i_tab)]);

    % Panel i
    handles.panels(i_tab) = uipanel(...
        'Parent',handles.figure_window,...
        'Units','characters',...
        'Position',[0.1 0 79.8 23],...
        'Visible','Off');
    handles.panel_a_text = uicontrol(...
        'Parent',handles.panels(i_tab),...
        'Units','characters',...
        'Position',[0 0 77 22],...
        'Style','text',...
        'String',['This is the tab ', alpha(i_tab)]);
end
% set callback for all buttons
set(handles.tabs, 'callback', {@tab_example_callback  handles})
% choose tab 1 as active
set(handles.panels(1), 'Visible','On');
guidata(handles.figure_window, handles);

function tab_example_callback(hObject,eventdata,handles)
% set everything invisible
set(handles.panels,'Visible','Off');
% turn on selected panel
set(handles.panels(handles.tabs == hObject), 'Visible','On');
guidata(handles.figure_window, handles);

est ce que vous aider?

3
répondu julietKiloRomeo 2013-03-15 12:35:55

je recommande fortement que si vous êtes à la création d'une interface graphique de toute la complexité, vous prenez un coup d'oeil à interface graphique Mise en page boîte à outils, et n'utilisez pas de GUIDE - il est tout simplement pas adapté à un but lors de la création D'interfaces graphiques complexes (ce n'est pas une critique, c'est juste qu'il est seulement conçu pour faire des interfaces graphiques simples et rapides).

GUI Layout Toolbox rend beaucoup plus facile de créer des interfaces graphiques professionnelles standard, et inclut des fonctionnalités pour les onglets, ainsi que beaucoup d'autres comme le redimensionnement facile et supplémentaire widget.

Pour répondre à certaines des préoccupations que vous avez soulevées dans les observations à d'autres réponses. GUI Layout Toolbox n'utilise aucune caractéristique non documentée / non supportée / cachée de MATLAB. Bien que ce ne soit pas un produit officiel de MathWorks, il est développé par Ben Tordoff et David Sampson de MathWorks consulting group, et est disponible gratuitement sous une licence qui signifie qu'il est très bien pour vous d'utiliser et d'inclure dans un produit déployé.

comme note d'accompagnement, vous mentionnez dans un commentaire que vos onglets chacune comprend environ 50 commandes. Je me demande si la vraie solution pourrait être de redessiner votre interface graphique un peu? Bien sûr, vous savez mieux que moi ce qui est approprié pour votre application, mais 50 contrôles visibles à l'utilisateur à la fois semble comme il pourrait être une mauvaise idée du point de vue de l'utilisabilité, ainsi que de présenter des difficultés pour les temps GUI redraw.

2
répondu Sam Roberts 2014-03-12 17:40:26

si vous êtes libre d'utiliser des fonctionnalités non documentées, je suggère d'utiliser uitab ou tabdlg. Voir ce post sur undocumentedmatlab.com.

1
répondu Florian Brucker 2014-03-12 17:41:28