2014-06-30 189 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});