在MATLAB R2019a(更新2)中,使用以下代码时,选择Tab2或Tab3时不显示轴工具栏。
classdef test < handle
properties
Ax
end
methods
function self = test()
f = figure;
tg = uitabgroup(f, 'SelectionChangedFcn', @self.onSelectionChanged);
t1 = uitab(tg, 'Title', 'tab1');
uitab(tg, 'Title', 'tab2');
uitab(tg, 'Title', 'tab3');
self.Ax = axes(t1);
end
function onSelectionChanged(self, ~, e)
self.Ax.Parent = e.NewValue;
end
end
end
我想知道如何使工具栏出现在所选选项卡中。
编辑:以下代码更好地显示了问题:轴工具栏卡在第一个面板中,而轴在第二个面板中。但是,要重现此内容,请勿将其复制并粘贴到您的MATLAB命令窗口中。仅在绘制轴工具栏后轴的父代发生更改时才会发生。因此,我将代码分为两部分:
f = figure;
p1 = uipanel(f, 'Units', 'normalized', 'Position', [0 0 .5 1]);
p2 = uipanel(f, 'Units', 'normalized', 'Position', [.5 0 .5 1]);
ax = axes(p1);
现在更改轴的父级:
ax.Parent = p2;
这是我的期望:
到目前为止,我还没有弄清楚如何触发将工具栏置于正确位置的事件。
更改Visible
,figure
,axes
或axtoolbar
的{{1}}属性都没有帮助。另外,用新工具栏覆盖工具栏也无济于事。
答案 0 :(得分:3)
我有一个坏消息,也有一个好消息:根据我的尝试,由于MATLAB的限制,似乎不能在容器(选项卡或面板)之间移动相同的工具栏,但是,一种解决方法是可行的。以下是我如何得出此结论的详细信息。
在进行一些调查后,我注意到AxesToolbar
的一些属性在首次显示后发生了变化,其中两个吸引了我的注意-HasTrueParent
和NodeParent
。
啊哈。因此,工具栏现在有一个父项,这意味着在子项层次结构中的某个位置,选项卡应该可以看到工具栏。让我们进一步调查:
我在您的类中添加了另一个属性Tabs
,这就是我在构造函数中填充它的方式:
self.Tabs(1) = uitab(tg, 'Title', 'tab1');
self.Tabs(2) = uitab(tg, 'Title', 'tab2');
self.Tabs(3) = uitab(tg, 'Title', 'tab3');
self.Tabs = handle(self.Tabs);
然后,在设置(并命中)断点后进行设置,我们可以看到:
K>> allchild(self.Tabs(1))
ans =
2×1 graphics array:
AnnotationPane
Axes
K>> allchild(self.Tabs(2))
ans =
0×0 empty GraphicsPlaceholder array.
注意到AnnotationPane
吗?这是包含注释的图层,可能还包含工具栏。我们怎么能确定呢?我们可以将其Visibility
设置为'off'
,然后工具栏将停止显示。
因此,很自然地,人们可能会试图更改该窗格的Parent
,但这会导致错误:
Error using matlab.graphics.shape.internal.AnnotationPane/setParentImpl
Cannot change parent of AnnotationPane object.
那么对此可以做什么?如果您在每个新标签页中创建新轴,则
hFig = figure();
hTG = uitabgroup(hFig);
for iTab = 1 : 3
hTab = uitab(hTG, 'title', "Tab" + iTab);
hPanel = uipanel(hTab);
hAxes(iTab) = axes(hPanel);
end
它们的工具栏将正确创建。从那里开始,需要重新定位(轴上的)子代并更新限制/视口。
答案 1 :(得分:3)
由于我认为上述行为是一个错误,因此已将其提交给Matlab员工。
他们回避了这个问题,应该重新设置“轴的父级”工具栏。如果是上面的测试类:
function onSelectionChanged(self, ~, e)
self.Ax.Parent = e.NewValue;
set(self.Ax.Toolbar,'Parent',[],'Parent',self.Ax);
end
答案 2 :(得分:1)
这是我以前的评论的另一个答案:
另一种解决方案是将轴放在uipanel
中(无论如何都是好习惯),然后重新为面板设置父级:
classdef test < handle
properties
Ax
end
methods
function self = test()
f = figure;
tg = uitabgroup(f, 'SelectionChangedFcn', @self.onSelectionChanged);
t1 = uitab(tg, 'Title', 'tab1');
uitab(tg, 'Title', 'tab2');
uitab(tg, 'Title', 'tab3');
self.Ax = axes(uipanel(t1)); % uipanel as axes parent
end
function onSelectionChanged(self, ~, e)
self.Ax.Parent.Parent = e.NewValue; % re-parent the uipanel
end
end
end