长时间潜伏 - 我非常感谢社区的知识。虽然我还没有找到合适的解决方案,但我已经在这里和其他地方看到了这个问题。如果我错过了之前列出的答案,请发布链接并接受我的道歉。
我的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 :(得分:0)
uistack()
将允许您调整uicontrol对象的顺序。孩子似乎并没有继承父母的位置,因此您不能将面板移到顶部并将其称为一天。为每个选项卡切换调用它可以得到所需的结果。
uistack(h.Tab1_TglBtn,'top');
uistack(h.Tab2_TglBtn,'top');
它仍然会越过面板边框,因此您必须根据需要调整其他对象,以获得更美观的GUI。
我不是100%确定正在修改哪些属性uistack
来调整对象顺序,如果你执行open uistack
,代码就会出现,但我没有机会透视它看看发生了什么。
答案 1 :(得分: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});