重新设定轴父级时,未显示轴工具栏

时间:2019-06-18 08:25:25

标签: matlab tabs matlab-figure toolbar parent

在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;

结果是:Result after re-parenting the axes

这是我的期望:

expected result

到目前为止,我还没有弄清楚如何触发将工具栏置于正确位置的事件。

更改Visiblefigureaxesaxtoolbar的{​​{1}}属性都没有帮助。另外,用新工具栏覆盖工具栏也无济于事。

3 个答案:

答案 0 :(得分:3)

我有一个坏消息,也有一个好消息:根据我的尝试,由于MATLAB的限制,似乎不能在容器(选项卡或面板)之间移动相同的工具栏,但是,一种解决方法是可行的。以下是我如何得出此结论的详细信息。


在进行一些调查后,我注意到AxesToolbar的一些属性在首次显示后发生了变化,其中两个吸引了我的注意-HasTrueParentNodeParent

啊哈。因此,工具栏现在有一个父项,这意味着在子项层次结构中的某个位置,选项卡应该可以看到工具栏。让我们进一步调查:

我在您的类中添加了另一个属性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