uifigure 组件的 addChild

addChild for uifigure components

我正在尝试使用 uifigure 开发我的第一个 GUI(以编程方式,而不是 appdesigner [但我已将其添加为关键字,因为它是相关的]),并且(如预期的那样) 我遗漏了 GUI Layout Toolbox and the Widgets Toolbox 为标准 java 数字提供的一些扩展功能和小部件。

因此,我尝试将我开发的一些小部件更改为 uifigure,并且 uigridlayout 似乎非常方便地替换了 uix.VBoxuix.HBox GUI 布局工具箱。

对于标准 java 图形,假设我有一个 class MyWidget 和一个相应的实例 mywidgetMyWidget 最终将成为 matlab.ui.container.internal.UIContainer 的祖先,它提供了一个 addChild 方法,可以重写该方法以自定义

的行为
  uicontrol(mywidget)

我正在寻找 uifigure 组件的相同内容。假设下面的 class 派生自 matlab.ui.container.GridLayout,这是 uigridlayout 调用结果的 class。

classdef MyGrid < matlab.ui.container.GridLayout
    methods
        function self = MyGrid(varargin)
            self = self@matlab.ui.container.GridLayout(varargin{:});
        end
    end
    methods ( Access = protected )

        function addChild(self, child)
            disp('hooray');
            addChild@matlab.ui.container.GridLayout(self, child);
        end
    end
end

当我现在启动一个 MyGrid 实例时

g = MyGrid()

一切看起来都不错:

g = 

  MyGrid with properties:

    RowHeight: {'1x'  '1x'}
    ColumnWidth: {'1x'  '1x'}

但向其添加 child 不会调用 addChild 方法:

>> uibutton(g)

ans = 

  Button (Button) with properties:

               Text: 'Button'
               Icon: ''
    ButtonPushedFcn: ''
           Position: [100 100 100 22]

注:上面hooray没有输出。 Parent 属性 是正确的:

>> ans.Parent

ans = 

  MyGrid with properties:

      RowHeight: {'1x'  '1x'}
    ColumnWidth: {'1x'  '1x'}

  Show all properties

据此我猜测 addChild 不是(至少 matlab.ui.container.GridLayout 所使用的)添加 child 的方法。

有人知道在 uifigure 组件中向容器添加 child 的机制吗?

不知道为什么昨天没看,但是matlab.ui.container.GridLayout的代码有(protected)方法

function handleChildAdded(obj, childAdded)
    obj.processChildAdded(childAdded);

    obj.addChildLayoutPropChangedListener(childAdded);

    obj.updateImplicitGridSize('childAdded', childAdded);

    obj.updateLastCell('childAdded', childAdded);
end

方法 processChildAdded 可能更适合我的目的,但它是私有的。无论如何,handleChildAdded 有效:

classdef MyGrid < matlab.ui.container.GridLayout
    methods
        function self = MyGrid(varargin)
            self = self@matlab.ui.container.GridLayout(varargin{:});
        end
    end
    methods ( Access = protected )
        function handleChildAdded(self, child)
            disp('hooray');
            handleChildAdded@matlab.ui.container.GridLayout(self, child);
        end
    end
end
>> g=MyGrid();
>> uibutton(g);
hooray