uifigure 组件的 addChild
addChild for uifigure components
我正在尝试使用 uifigure
开发我的第一个 GUI(以编程方式,而不是 appdesigner
[但我已将其添加为关键字,因为它是相关的]),并且(如预期的那样) 我遗漏了 GUI Layout Toolbox and the Widgets Toolbox 为标准 java 数字提供的一些扩展功能和小部件。
因此,我尝试将我开发的一些小部件更改为 uifigure
,并且 uigridlayout
似乎非常方便地替换了 uix.VBox
和 uix.HBox
GUI 布局工具箱。
对于标准 java 图形,假设我有一个 class MyWidget
和一个相应的实例 mywidget
。 MyWidget
最终将成为 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
我正在尝试使用 uifigure
开发我的第一个 GUI(以编程方式,而不是 appdesigner
[但我已将其添加为关键字,因为它是相关的]),并且(如预期的那样) 我遗漏了 GUI Layout Toolbox and the Widgets Toolbox 为标准 java 数字提供的一些扩展功能和小部件。
因此,我尝试将我开发的一些小部件更改为 uifigure
,并且 uigridlayout
似乎非常方便地替换了 uix.VBox
和 uix.HBox
GUI 布局工具箱。
对于标准 java 图形,假设我有一个 class MyWidget
和一个相应的实例 mywidget
。 MyWidget
最终将成为 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