2013-02-04 4 views
14

MATLAB의 GUI에서 작업 중이며 탭을 사용하여 정보를 구성합니다. 탭이 MATLAB GUIDE에서 지원되지 않으므로 여러 개의 uipanel을 작성하고 'Visible' 필드를 변경하십시오. 그러나 각 패널 내의 컨트롤 수가 많으면 패널을 전환하는 데 약간의 시간이 걸립니다. 탭 전환을 더 빠르게하는 방법을 아는 사람이 있습니까? MATLAB GUI의 최적화 된 탭

나는 탭 기반 인터페이스의 간단한 예를 포함한다.

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 

참고 : GUI 5 개 탭에서 시뮬레이션을위한 매개 변수를 소개하는 것입니다. 각 탭에는 약 15 개의 행이 있습니다. 각 행은 하나의 text, 하나의 checkbox 및 세 개의 edit을 갖는다. 나를 위해 혼잡하지 않습니다. 게다가 최소한의 코드와 오버 헤드로 독자적으로 레이아웃과 콜백을 만들었습니다. 그러나 여전히 매우 성가신 탭 전환이 있습니다.

+1

나는 모든 패널이 표시 될 수 있다는 생각하지만, 자신의 위치는 주역의 외부에 배치된다. 따라서 탭을 선택하면 이전 탭이 사라지고 새 탭이 표시됩니다. 이 방법으로, 모든 패널이 GPU 메모리에 캐시되고 전환이 더 빨라질 수 있습니다 ... – tashuhka

+1

렌더링의 기본값은 'DoubleBuffer', 'on', 'Renderer', 'painters', 'RendererMode', 'auto'등 빠르다고 생각합니다. 다른 조합은 더 빠를 수 있습니까? – tashuhka

+0

탭 사이를 전환하는 매개 변수로 '표시'대신 '위치'를 사용하려고했지만 개선에 대해 감사 할 수 없습니다. 나는 또한 같은 결과로 다른 렌더링 조합을 시도했다. – tashuhka

답변

3

당신은 배열에 핸들을 넣어 어쩌면합니다. 그렇게하면 각자를 통과 할 필요가 없습니다. 이것은 나에게 빠른 보이지만, '빠른'는 많은 것들 :

나는 예를 짧게 만들기 위해 속성의 일부를 제거 ...

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); 

을 의미 할 수 있습니까 그 도움 당신 알아? 당신이 문서화되지 않은 기능을 무료로 사용할 경우

+1

그건 재미있는 생각이에요. 프로파일 러는 실제로 약간 더 나은 계산 시간을 보여줍니다. 안타깝게도 인간의 눈에 대한 인식은 그다지 중요하지 않습니다. 하지만 시간과 코드에 대해 감사 드리며, 꽤 깔끔하게 보이고 코딩 개선을 위해 좋은 아이디어를주었습니다. – tashuhka

1

, 나는 uitab 또는 tabdlg을 사용하는 것이 좋습니다. this post on undocumentedmatlab.com을 참조하십시오.

+1

제안 해 주셔서 감사합니다. Mathworks는 실제로 탭 작업을하고있는 것 같습니다. 이것은 훌륭합니다. 불행히도, 나는 가까운 미래에 기능하지 않을 코드를 배치 할 수 없다. – tashuhka

2

복잡성이있는 GUI를 만드는 경우 GUI Layout Toolbox을 살펴보고 GUIDE를 사용하지 말 것을 강력히 권장합니다. 복잡한 GUI를 만들 때 목적에 맞지 않습니다 (이는 비판이 아닙니다. 그것은 단지 빠르고 간단한 GUI를 만들기 위해 설계된 것입니다).

GUI 레이아웃 도구 상자를 사용하면 전문가 용 표준 GUI를 훨씬 쉽게 제작할 수 있으며 탭 크기뿐만 아니라 크기를 쉽게 조정할 수 있고 위젯을 추가 할 수 있습니다.

는 다른 답변에 의견에서 제기 된 문제 중 일부를 해결하기 위해. GUI 레이아웃 도구 상자는 MATLAB의 문서화되지 않은/지원되지 않는/숨겨진 기능을 사용하지 않습니다. 공식 MathWorks 제품은 아니지만 MathWorks 컨설팅 그룹의 Ben Tordoff와 David Sampson이 개발했으며 배포 된 제품에 사용하고 포함하는 것은 괜찮습니다. 보조 노트로

, 당신은 당신의 탭은 각각 약 50 컨트롤을 포함하는 하나의 코멘트에 언급. 진짜 해결책이 당신의 GUI를 약간 재 설계 할지도 모르겠다. 물론 응용 프로그램에 적합한 것이 무엇인지 잘 알 수 있지만 사용자가 볼 수있는 50 개의 컨트롤은 GUI 재 작성 시간에 어려움을 겪을뿐만 아니라 유용성 측면에서 좋지 않은 것처럼 보입니다.

+0

답장을 보내 주셔서 감사합니다. @Sam Roberts. GUI Layout Toolbox를 살펴 보았습니다. 실제로 수행 한 훌륭한 작업이 놀랍습니다. * CardPanel.m * 파일에는 탭의 가시성을 처리하는 * showSelectedChild * 함수가 포함되어 있습니다. 눈에 보이지 않는 패널에서 2500 픽셀을 이동하여 탭의 위치를 ​​변경합니다. 과거에이 옵션을 시도했지만 깜박임과 동결이 여전히있었습니다. – tashuhka

+0

나는 GUI가 복잡한 GUI에 유용하지 않다는 것에 전적으로 동의합니다. 사실, 모든 모듈을 제어 할 수 있도록 레이아웃을 직접 작성합니다. – tashuhka

+3

패널에 ~ 50 개의 컨트롤이있는 경우 약간의 깜박임 또는 GUI 응답 성의 부재가 불가피 할 수 있습니다. 이전에 패널의 모든 하위 항목을 사용하지 않도록 설정하고 전환을 수행하고 '일시 중지 (0.5)'를 추가 한 다음 하위 항목을 다시 사용하도록 설정하여 유사한 상황을 해결했습니다. 지연이 있지만 깜박임은 없습니다. 장애가 발생하면 컨트롤이 회색으로 표시되어 사람들이 좀 더 수용 할 수있는 것으로 나타났습니다. 그래서 그들은 "무슨 일이 일어나고 있는지"알았습니다. 정말 나쁜 경우에는 약간의 Java를 사용하여 일시적으로 커서를 회 전자로 변경할 수도 있습니다. –