matlab.ui.componentcontainer.ComponentContainer 类
命名空间: matlab.ui.componentcontainer
用于开发自定义 UI 组件对象的基类
描述
matlab.ui.componentcontainer.ComponentContainer 是您用于创建自己的自定义 UI 组件对象类的基类。定义此基类的子类时,可以使用 ComponentContainer 属性和方法来构建 UI 组件对象。在您的类定义文件的第一行指定以下语法以直接从 ComponentContainer 类继承,其中 MyComponent 是您的对象的名称:
classdef MyComponent < matlab.ui.componentcontainer.ComponentContainer
matlab.ui.componentcontainer.ComponentContainer 类是一个 handle 类。
属性
颜色和样式
背景颜色,指定为 RGB 三元组、十六进制颜色代码或下表中列出的颜色选项之一。
RGB 三元组和十六进制颜色代码对于指定自定义颜色非常有用。
RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度值必须位于
[0,1]范围内,例如[0.4 0.6 0.7]。十六进制颜色代码是字符向量或字符串标量,以井号 (
#) 开头,后跟三个或六个十六进制数字,范围可以是0到F。这些值不区分大小写。因此,颜色代码"#FF8800"与"#ff8800"、"#F80"与"#f80"是等效的。
此外,还可以按名称指定一些常见的颜色。下表列出了命名颜色选项、等效 RGB 三元组和十六进制颜色代码。
| 颜色名称 | 短名称 | RGB 三元组 | 十六进制颜色代码 | 外观 |
|---|---|---|---|---|
"red" | "r" | [1 0 0] | "#FF0000" |
|
"green" | "g" | [0 1 0] | "#00FF00" |
|
"blue" | "b" | [0 0 1] | "#0000FF" |
|
"cyan" | "c" | [0 1 1] | "#00FFFF" |
|
"magenta" | "m" | [1 0 1] | "#FF00FF" |
|
"yellow" | "y" | [1 1 0] | "#FFFF00" |
|
"black" | "k" | [0 0 0] | "#000000" |
|
"white" | "w" | [1 1 1] | "#FFFFFF" |
|
下表列出了浅色和深色主题中绘图的默认调色板。
| 调色板 | 调色板颜色 |
|---|---|
在 R2025a 之前的版本中: 大多数绘图默认使用这些颜色。 |
|
|
|
您可以使用 orderedcolors 和 rgb2hex 函数获取这些调色板的 RGB 三元组和十六进制颜色代码。例如,获取 "gem" 调色板的 RGB 三元组并将其转换为十六进制颜色代码。
RGB = orderedcolors("gem");
H = rgb2hex(RGB);在 R2023b 之前的版本中: 使用 RGB = get(groot,"FactoryAxesColorOrder") 获取 RGB 三元组。
在 R2024a 之前的版本中: 使用 H = compose("#%02X%02X%02X",round(RGB*255)) 获取十六进制颜色代码。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
交互性
可见性状态,指定为 'on' 或 'off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true,'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。
'on'- 显示对象。'off'- 隐藏对象而不删除它。您仍然可以访问不可见 UI 组件的属性。
要使您的 App 更快地启动,请将不需要在启动时出现的所有组件的 Visible 属性设置为 'off'。
更改不可见的容器的大小将在该容器变得可见时触发 SizeChangedFcn 回调。
更改容器的 Visible 属性不会改变其子组件的 Visible 属性值。即使隐藏容器会导致子组件隐藏也是如此。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
上下文菜单,指定为使用 uicontextmenu 函数创建的 ContextMenu 对象。当右键点击不包含任何基础 UI 组件或图形对象的组件区域时,将使用此属性显示上下文菜单。
要在右键点击自定义 UI 组件的任何部分时显示上下文菜单,请编写代码,以便每当设置自定义组件的 ContextMenu 属性时都设置所有基础 UI 组件和图形对象的 ContextMenu 属性。
示例:具有上下文菜单的组件
以下代码将创建一个简单的自定义 UI 组件,其中使用网格布局管理器来放置标签和按钮。每当用户创建 SimpleComponent 类实例并将一个上下文菜单赋给该组件时,update 方法中的代码就会将同一上下文菜单赋给底层 GridLayout、Button 和 Label 对象。
classdef SimpleComponent < matlab.ui.componentcontainer.ComponentContainer properties (Access = private, Transient, NonCopyable) GridLayout matlab.ui.container.GridLayout Button matlab.ui.control.Button Label matlab.ui.control.Label end methods (Access=protected) function setup(obj) % Set component size obj.Position = [100 100 220 50]; % Create grid obj.GridLayout = uigridlayout(obj,[1 2]); % Create components obj.Label = uilabel(obj.GridLayout,... "Text","My component"); obj.Button = uibutton(obj.GridLayout); end function update(obj) obj.GridLayout.ContextMenu = obj.ContextMenu; obj.Label.ContextMenu = obj.ContextMenu; obj.Button.ContextMenu = obj.ContextMenu; end end end
创建一个 SimpleComponent 对象并指定上下文菜单。右键点击组件和标签上的空白区域。将显示上下文菜单。
fig = uifigure;
cm = uicontextmenu(fig);
m1 = uimenu(cm);
SimpleComponent(fig,"ContextMenu",cm);属性:
GetAccess | public |
SetAccess | public |
NonCopyable | true |
Transient | true |
GetObservable | true |
SetObservable | true |
位置
UI 组件的大小和位置,不包括轴标签和刻度线等装饰元素的边距。以 [left bottom width height] 形式的向量指定此属性。
注意
当 UI 组件的父级是 GridLayout 时,设置此属性不起作用。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
测量单位,指定为 'pixels'。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
布局选项,指定为 GridLayoutOptions 对象。此属性为网格布局容器的子级组件指定选项。如果组件不是网格布局容器的子级(例如,它是图窗或面板的子级),则此属性为空且不起作用。但是,如果组件是网格布局容器的子级,则可以通过设置 GridLayoutOptions 对象的 Row 和 Column 属性,将组件放置在网格的所需行和列中。
例如,以下代码将一个图像组件放置在其父网格的第三行第二列中。
g = uigridlayout([4 3]); im = uiimage(g); im.ImageSource = 'peppers.png'; im.ScaleMethod = 'fill'; im.Layout.Row = 3; im.Layout.Column = 2;
要使该图像跨多个行或列,请将 Row 或 Column 属性指定为二元素向量。例如,此图像横跨列 2 和 3。
im.Layout.Column = [2 3];
属性:
GetAccess | public |
SetAccess | public |
回调
更改大小时执行的回调,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB® 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
SizeChangedFcn 回调在下列情况下执行:
该组件首次变得可见。
该组件在大小改变时可见。
该组件在大小改变后首次变得可见。如果组件在大小改变时不可见,但后来变得可见,就属于这种情况。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
对象创建函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定要在 MATLAB 创建对象时执行的回调函数。MATLAB 将在执行 CreateFcn 回调之前初始化所有属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。
对现有组件设置 CreateFcn 属性没有任何作用。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问正在创建的对象。否则,使用 gcbo 函数访问该对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
对象删除函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定在 MATLAB 删除对象时要执行的回调函数。MATLAB 在销毁对象的属性之前执行 DeleteFcn 回调。如果不指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问要删除的对象。否则,使用 gcbo 函数访问该对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
回调执行控件
回调中断,指定为 'on' 或 'off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true,'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。
此属性确定是否可以中断运行中回调。有以下两种回调状态要考虑:
运行中回调是当前正在执行的回调。
中断回调是试图中断运行中回调的回调。
每当 MATLAB 调用回调时,回调都会试图中断正在运行的回调(如果存在)。运行中回调所属对象的 Interruptible 属性决定着是否允许中断。
注意
回调的中断和执行在以下情况下会有不同的表现:
如果中断回调是
DeleteFcn、CloseRequestFcn或SizeChangedFcn回调,则无论是否存在Interruptible属性值都会发生中断。如果运行中回调当前正在执行
waitfor函数,则无论是否存在Interruptible属性值都会发生中断。Timer对象根据排定时间执行,而不管Interruptible属性值如何。
发生中断时,MATLAB 不保存属性状态或显示内容。例如,gca 或 gcf 命令返回的对象可能会在另一个回调执行时发生改变。
属性:
GetAccess | public |
SetAccess | public |
GetObservable | true |
SetObservable | true |
回调排队,指定为 'queue' 或 'cancel'。BusyAction 属性决定 MATLAB 如何处理中断回调的执行。有以下两种回调状态要考虑:
运行中回调是当前正在执行的回调。
中断回调是试图中断运行中回调的回调。
无论何时 MATLAB 调用回调,该回调都会试图中断运行中回调。运行中回调所属对象的 Interruptible 属性决定着是否允许中断。如果不允许中断,则中断回调所属对象的属性 BusyAction 将决定是放弃该回调还是将回调放入队列中。以下是 BusyAction 属性的可能值:
'queue'- 将中断回调放入队列中,以便在运行中回调执行完毕后进行处理。'cancel'- 不执行中断回调。
属性:
GetAccess | public |
SetAccess | public |
GetObservable | true |
SetObservable | true |
删除状态,以 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值形式返回。
当 DeleteFcn 回调开始执行时,MATLAB 会将 BeingDeleted 属性设置为 'on'。BeingDeleted 属性将一直保持 'on' 设置状态,直到组件对象不再存在为止。
在查询或修改对象之前,请先检查其 BeingDeleted 属性的值,以确认它不是待删除项。
属性:
GetAccess | public |
SetAccess | protected |
GetObservable | true |
SetObservable | true |
父级/子级
组件的父容器,指定为 Figure、Panel、Tab 或 GridLayout 对象。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
Dependent | true |
NonCopyable | true |
GetObservable | true |
SetObservable | true |
UI 组件子级,以空 GraphicsPlaceholder 数组形式返回。自定义 UI 组件没有子级。设置此属性不会产生任何影响。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
Dependent | true |
NonCopyable | true |
对象句柄的可见性,指定为 'on'、'callback' 或 'off'。
此属性控制对象在其父级的子级列表中的可见性。当对象未显示在其父级的子级列表中时,通过搜索对象层次结构或查询属性来获取对象的函数不会返回该对象。这些函数包括 get、findobj、clf 和 close。对象即使在不可见时也有效。如果可以访问某个对象,则可以设置和获取其属性,并将其传递给针对对象进行运算的任意函数。
| HandleVisibility 值 | 描述 |
|---|---|
'on' | 对象始终可见。 |
'callback' | 对象对于回调或回调调用的函数可见,但对于命令行调用的函数不可见。此选项阻止通过命令行访问对象,但允许回调函数访问它。 |
'off' | 对象始终不可见。该选项用于防止另一函数无意中对 UI 进行更改。将 HandleVisibility 设置为 'off' 可在执行该函数时暂时隐藏对象。 |
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
标识符
UI 组件对象的类型,以包含组件名称的字符向量形式返回。
属性:
GetAccess | public |
SetAccess | protected |
NonCopyable | true |
Transient | true |
对象标识符,指定为字符向量或字符串标量。您可以指定唯一的 Tag 值作为对象的标识符。如果需要访问您代码中其他位置的对象,可以使用 findobj 函数基于 Tag 值搜索对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
用户数据,指定为任何 MATLAB 数组。例如,您可以指定标量、向量、矩阵、元胞数组、字符数组、表或结构体。使用此属性存储对象上的任意数据。
如果您在 App 设计工具中工作,请在该 App 中创建公共或私有属性以共享数据,而不是使用 UserData 属性。有关详细信息,请参阅在用 App 设计工具创建的 App 内共享数据。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
GetObservable | true |
SetObservable | true |
方法
示例
定义名为 IPAddressComponent 的类,该类创建一个自定义组件,用于输入四个值来构成 IP 地址。
要定义该类,请创建包含以下类定义的名为 IPAddressComponent.m 的文件,该文件具有如下特性:
存储 IP 地址的
Value公共属性。NumericField和GridLayout私有属性,它们在一个水平行中放置四个数值编辑字段。一个
setup方法,用于初始化NumericField和GridLayout。一个
update方法,用于在 IP 地址发生变化时更新NumericField值。一个
handleNewValue方法,它基于 4 个数值编辑字段的值设置Value属性。
classdef IPAddressComponent < matlab.ui.componentcontainer.ComponentContainer % IPAddressComponent a set of 4 edit fields for IP Address input properties Value (1,4) {mustBeNonnegative, mustBeInteger, mustBeLessThanOrEqual(Value, 255)} = [192 168 1 2]; end events (HasCallbackProperty, NotifyAccess = protected) ValueChanged % ValueChangedFcn callback property will be generated end properties (Access = private, Transient, NonCopyable) NumericField (1,4) matlab.ui.control.NumericEditField GridLayout matlab.ui.container.GridLayout end methods (Access=protected) function setup(obj) % Set the initial position of this component obj.Position = [100 100 150 22]; % Layout obj.GridLayout = uigridlayout(obj,[1,4], ... 'RowHeight',{22},'ColumnWidth',{'1x','1x','1x','1x'},... 'Padding',0,'ColumnSpacing',2); % Building blocks for k = 1:4 obj.NumericField(k) = uieditfield(obj.GridLayout, 'numeric',... 'Limits', [0 255], 'RoundFractionalValues', true, ... 'FontName', 'Courier New', 'FontWeight', 'bold', ... 'ValueChangedFcn',@(src,event) obj.handleNewValue()); end end function update(obj) % Update view for k = 1:4 obj.NumericField(k).Value = obj.Value(k); end end end methods (Access=private) function handleNewValue(obj) obj.Value = [obj.NumericField.Value]; % Execute the event listeners and the ValueChangedFcn callback property notify(obj,'ValueChanged'); end end end
接下来,通过调用由 ComponentContainer 类提供的 IPAddressComponent 构造函数方法来创建组件,并将对象返回为 h。指定一个函数,当组件值更改时,该函数在命令行窗口中显示新 IP 地址。
h = IPAddressComponent;

h.ValueChangedFcn = @(src,event) disp("Value changed to: " + num2str(h.Value));在编辑字段中输入 IP 地址 192.168.1.10。MATLAB® 在命令行窗口中显示更新后的 IP 地址。
限制
ComponentContainer类的所有子类自动包含静态方法loadobj的内置实现,该方法无法重载。同样,如果您的类派生自matlab.mixin.CustomElementSerialization,它会自动包含静态方法finalizeIncomingObject的内置实现,该方法无法重载。即使您尝试重载这些方法,MATLAB 也会使用这些方法的内置实现。
详细信息
定义类时,可以选择为 UI 组件触发的事件添加模块。
要创建这样的事件模块,请为类分配具有 HasCallbackProperty 属性的 events 模块。执行此操作时,MATLAB 为模块中的每个事件创建一个公共属性。公共属性存储用户提供的回调,以便在事件触发时执行。公共属性的名称是事件名称后追加字母 Fcn。例如,UI 组件可以定义公共事件 ValueChanged,并生成对应的公共属性 ValueChangedFcn。使用 notify 方法触发事件并在属性中执行回调。
例如,以下是允许用户选取颜色值的 UI 组件的事件模块。
events (HasCallbackProperty, NotifyAccess = protected) ValueChanged end
notify 方法以触发 ValueChanged 事件并在 ValueChangedFcn 属性中执行回调。function getColorFromUser(obj) c = uisetcolor(obj.Value); if (isscalar(c) && (c == 0)) return; end % Update the Value property oldValue = obj.Value; obj.Value = c; % Execute user callbacks and listeners notify(obj,'ValueChanged'); end
f = uifigure; c = ColorSelector(f,'ValueChangedFcn',@(o,e)disp('Changed'))
在定义您的类后,当用户创建您的 UI 组件的实例并将其添加到其 App 时,MATLAB 会按顺序执行以下步骤:
如果用户未指定父级,则创建一个新 UI 图窗,并将其作为该组件的父级。
调用类
setup方法。设置用户指定为名称-值参量的任何组件属性。
调用类
update方法。
版本历史记录
在 R2020b 中推出
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)









