2014-06-30 45 views
0

長時間潛伏者 - 我真的很感謝社區的知識。我已經在這裏和其他地方看到過這個問題,但我還沒有找到合適的解決方案。如果我錯過了之前列出的答案,請張貼鏈接並接受我的道歉。MATLAB GUI:滑塊作爲滾動條;子面板不夾

我的GUI圖有一個uibuttongroup的主面板作爲頂部的標籤。每個選項卡都可以顯示不同大小的子面板(填充了各種內容),並使用滑塊向下滾動子面板。

一般來說,這是有效的。但是,當我向下滾動時,子面板的內容(不是子面板本身)覆蓋頂部的我的選項卡(應始終可見)。我認爲這可能與裁剪有關,但我無法弄清楚如何完成這項工作。有人知道如何防止這種情況發生嗎?

我已經包括代碼(與簡潔的功能有限),顯示我的情況:

function h = ScrollQuestion_StackOverflow 


h.myFig = figure('position', [100 100 800 600],... 
    'menubar','none'); 


%% Panel covers full figure 
h.Main_Panel = uipanel('Parent', h.myFig,... 
    'units','normalized',... 
    'position', [0 0 1 1],... 
    'visible','on'); 


%% ALWAYS needs to be visible by the user, not covered by anything 
h.Main_BtnGrp = uibuttongroup('parent', h.Main_Panel,... 
    'units','normalized',... 
    'position', [0 .95 1 .05]); 

h.Tab1_TglBtn = uicontrol('parent', h.Main_BtnGrp,... 
    'units','normalized',... 
    'position', [0 0 .125 1],... 
    'style','togglebutton',... 
    'string', 'Tab1'); 

h.Tab2_TglBtn = uicontrol('parent', h.Main_BtnGrp,... 
    'units','normalized',... 
    'position', [.125 0 .125 1],... 
    'style','togglebutton',... 
    'string', 'Tab2'); 


%% Oversized sub-panel 
h.ThisPanelMoves = uipanel('parent',h.Main_Panel,... 
    'units','normalized',... 
    'position', [0 -1 1 1.95]); 

% Generic content of sub-panel 
h.ContentText = uicontrol('parent', h.ThisPanelMoves,... 
    'units','normalized',... 
    'position', [.05 .95 .8 .05],... 
    'style','text',... 
    'string', 'BLOCKS TABS WHEN YOU SCROLL DOWN',... 
    'fontsize', 20,... 
    'clipping','on'); 


%% Add slider 
h.Tab1_Slider = uicontrol('Parent', h.myFig,... 
    'units','normalized',... 
    'position',[.98, 0 .02 1],... 
    'style', 'slider',... 
    'value', 1,... 
    'callback', {@SliderCallback, h}); 

guidata(h.myFig,h) 


%% Slider Callback 
function SliderCallback(hObject, eventdata, h) 
    val = get(hObject,'Value'); 
    set(h.ThisPanelMoves, 'Position', [0 -val 1 1.95]); 

非常感謝您的幫助!

+0

雖然我並不完全滿意,我發現一種解決方法:它似乎創建順序決定了哪個項目處於頂部。如果我先創建超大的子面板,然後再創建uibuttongroup,那麼當我向下滾動時,選項卡會顯示在頂部。視覺仍然不是非常漂亮,但它似乎工作。 – Frank

+0

如果有人(1)知道如何清理視覺[我寧願沒有通過uibuttongroup框架展示子面板內容],或者(2)知道如何「將項目置於前面」,而不管創建順序如何真的很感激它。 – Frank

回答

0

uistack()將允許您調整您的uicontrol對象的順序。看起來孩子們並沒有繼承他們父母的地位,所以你不能把你的面板移到頂端,並且每天都會這麼做。爲每個選項卡切換調用它可獲得所需的結果。

uistack(h.Tab1_TglBtn,'top'); 
uistack(h.Tab2_TglBtn,'top'); 

它仍然越過國界面板,所以你必須根據需要調整您的其他對象,以獲得更美觀的界面。

我不是100%確定哪些屬性uistack正在修改調整對象的順序,代碼存在,如果你做一個open uistack,但我還沒有機會看一下看穿它是怎麼回事。

0

變化的函數:

function SliderCallback(hObject, eventdata, h) 
    val = get(hObject,'Value'); 
    set(h.ThisPanelMoves, 'Position', [0 -val 1 1.95]); 
end 

對於此:

function SliderCallback(hObject, eventdata, h) 
    val = get(hObject,'Value'); 
    set(h.ThisPanelMoves, 'Position', [0 -val 1 0.95]); 
end 

在代碼中,所述移動板的高度是大於窗口大小(1.95更大,而窗口的極限是1)。

而在滑塊設置最大和最小限制爲「1」和「0」,以不具有圓形運動:

%% Add slider h.Tab1_Slider = uicontrol('Parent', h.myFig,... 
    'units','normalized',... 
    'position',[.98, 0 .02 1],... 
    'style', 'slider',... 
    'value', 1, 'max', 1, 'min', 0,... 
    'callback', {@SliderCallback, h});