轴重新设置父级时,不显示轴工具栏
Axes toolbar is not shown when axes is re-parented
在MATLAB R2019a(Update 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 命令 window 中。只有在绘制坐标区工具栏后坐标区的父项发生更改时才会发生这种情况。因此我将代码分成两部分:
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;
结果如下:
这是我的预期:
到目前为止,我还没有想出如何触发将工具栏放在正确位置的事件。
更改 figure
、axes
、axtoolbar
或 uipanel
的 Visible
属性 都没有帮助。此外,用新工具栏覆盖也无济于事。
我有一些坏消息和一些好消息:根据我的尝试,由于 MATLAB 的限制,似乎无法在容器(选项卡或面板)之间移动相同的工具栏,但是,一种解决方法是可能的。以下是我如何得出这个结论的详细信息。
稍微调查了一下,我注意到 AxesToolbar
的几个属性在第一次显示后发生了变化,其中两个引起了我的注意 - HasTrueParent
和 NodeParent
.
啊哈。所以工具栏现在有一个父级,这意味着在子级层次结构中的某个位置,选项卡应该看到工具栏。让我们进一步调查:
我已将另一个 属性 添加到您的 class 调用 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
他们的工具栏将被正确创建。从那里开始,这是一个重新定位(轴的)子项并更新 limits/viewport.
的问题
由于我认为上述行为是一个错误,因此我已将其提交给 Matlab 工作人员。
他们的回应是解决这个问题,应该 re-set 轴工具栏的父级。如果上面的测试 class:
function onSelectionChanged(self, ~, e)
self.Ax.Parent = e.NewValue;
set(self.Ax.Toolbar,'Parent',[],'Parent',self.Ax);
end
这是我之前评论的另一个答案:
另一种解决方案是将轴放在 uipanel
中(无论如何这是一个好习惯)然后 re-parent 面板:
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
在MATLAB R2019a(Update 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 命令 window 中。只有在绘制坐标区工具栏后坐标区的父项发生更改时才会发生这种情况。因此我将代码分成两部分:
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;
结果如下:
这是我的预期:
到目前为止,我还没有想出如何触发将工具栏放在正确位置的事件。
更改 figure
、axes
、axtoolbar
或 uipanel
的 Visible
属性 都没有帮助。此外,用新工具栏覆盖也无济于事。
我有一些坏消息和一些好消息:根据我的尝试,由于 MATLAB 的限制,似乎无法在容器(选项卡或面板)之间移动相同的工具栏,但是,一种解决方法是可能的。以下是我如何得出这个结论的详细信息。
稍微调查了一下,我注意到 AxesToolbar
的几个属性在第一次显示后发生了变化,其中两个引起了我的注意 - HasTrueParent
和 NodeParent
.
啊哈。所以工具栏现在有一个父级,这意味着在子级层次结构中的某个位置,选项卡应该看到工具栏。让我们进一步调查:
我已将另一个 属性 添加到您的 class 调用 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
他们的工具栏将被正确创建。从那里开始,这是一个重新定位(轴的)子项并更新 limits/viewport.
的问题由于我认为上述行为是一个错误,因此我已将其提交给 Matlab 工作人员。
他们的回应是解决这个问题,应该 re-set 轴工具栏的父级。如果上面的测试 class:
function onSelectionChanged(self, ~, e)
self.Ax.Parent = e.NewValue;
set(self.Ax.Toolbar,'Parent',[],'Parent',self.Ax);
end
这是我之前评论的另一个答案:
另一种解决方案是将轴放在 uipanel
中(无论如何这是一个好习惯)然后 re-parent 面板:
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