matlab.ui.componentcontainer.ComponentContainer 类
包: matlab.ui.componentcontainer
描述
matlab.ui.componentcontainer.ComponentContainer
是您用于创建自己的自定义 UI 组件对象类的基类。定义此基类的子类时,可以使用 ComponentContainer
属性和方法来构建 UI 组件对象。在您的类定义文件的第一行指定以下语法以直接从 ComponentContainer
类继承,其中 MyComponent
是您的对象的名称:
classdef MyComponent < matlab.ui.componentcontainer.ComponentContainer
matlab.ui.componentcontainer.ComponentContainer
类是 handle
类。
属性
BackgroundColor
— 背景色
[0.94 0.94 0.94]
(默认) | RGB 三元组 | 十六进制颜色代码 | 'r'
| 'g'
| 'b'
| ...
背景颜色,指定为 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" |
以下是 MATLAB® 在许多类型的绘图中使用的默认颜色的 RGB 三元组和十六进制颜色代码。
RGB 三元组 | 十六进制颜色代码 | 外观 |
---|---|---|
[0 0.4470 0.7410] | "#0072BD" | |
[0.8500 0.3250 0.0980] | "#D95319" | |
[0.9290 0.6940 0.1250] | "#EDB120" | |
[0.4940 0.1840 0.5560] | "#7E2F8E" | |
[0.4660 0.6740 0.1880] | "#77AC30" | |
[0.3010 0.7450 0.9330] | "#4DBEEE" | |
[0.6350 0.0780 0.1840] | "#A2142F" |
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
Visible
— 可见性状态
'on'
(默认) | on/off 逻辑值
可见性状态,指定为 '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 |
ContextMenu
— 上下文菜单
空 GraphicsPlaceholder
数组 (默认) | ContextMenu
对象
上下文菜单,指定为使用 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 |
Position
— UI 组件的大小和位置,不包括边距
[100 100 100 100]
(默认) | [left bottom width height]
UI 组件的大小和位置,不包括轴标签和刻度线等装饰元素的边距。以 [left bottom width height]
形式的向量指定此属性。
注意
当 UI 组件的父级是 GridLayout
时,设置此属性不起作用。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
Units
— 测量单位
'pixels'
(默认)
测量单位,指定为 'pixels'
。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
Layout
— 布局选项
空 LayoutOptions
数组 (默认) | GridLayoutOptions
对象
布局选项,指定为 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 |
SizeChangedFcn
— 更改大小时执行的回调
''
(默认) | 函数句柄 | 元胞数组 | 字符向量
更改大小时执行的回调,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参数。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
SizeChangedFcn
回调在下列情况下执行:
该组件首次变得可见。
该组件在大小改变时可见。
该组件在大小改变后首次变得可见。如果组件在大小改变时不可见,但后来变得可见,就属于这种情况。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
CreateFcn
— 创建函数
''
(默认) | 函数句柄 | 元胞数组 | 字符向量
对象创建函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参数。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定要在 MATLAB 创建对象时执行的回调函数。MATLAB 将在执行 CreateFcn
回调之前初始化所有属性值。如果不指定 CreateFcn
属性,则 MATLAB 执行默认的创建函数。
对现有组件设置 CreateFcn
属性没有任何作用。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参数访问正在创建的对象。否则,使用 gcbo
函数访问该对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
DeleteFcn
— 删除函数
''
(默认) | 函数句柄 | 元胞数组 | 字符向量
对象删除函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参数。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定在 MATLAB 删除对象时要执行的回调函数。MATLAB 在销毁对象的属性之前执行 DeleteFcn
回调。如果不指定 DeleteFcn
属性,则 MATLAB 执行默认的删除函数。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参数访问要删除的对象。否则,使用 gcbo
函数访问该对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
AbortSet | true |
GetObservable | true |
SetObservable | true |
NonCopyable | true |
Interruptible
— 回调中断
'on'
(默认) | on/off 逻辑值
回调中断,指定为 '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 |
BusyAction
— 回调排队
'queue'
(默认) | 'cancel'
回调排队,指定为 'queue'
或 'cancel'
。BusyAction
属性决定 MATLAB 如何处理中断回调的执行。有以下两种回调状态要考虑:
运行中回调是当前正在执行的回调。
中断回调是试图中断运行中回调的回调。
无论何时 MATLAB 调用回调,该回调都会试图中断运行中回调。运行中回调所属对象的 Interruptible
属性决定着是否允许中断。如果不允许中断,则中断回调所属对象的属性 BusyAction
将决定是放弃该回调还是将回调放入队列中。以下是 BusyAction
属性的可能值:
'queue'
- 将中断回调放入队列中,以便在运行中回调执行完毕后进行处理。'cancel'
- 不执行中断回调。
属性:
GetAccess | public |
SetAccess | public |
GetObservable | true |
SetObservable | true |
BeingDeleted
— 删除状态
on/off 逻辑值
删除状态,以 matlab.lang.OnOffSwitchState
类型的 on/off 逻辑值形式返回。
当 DeleteFcn
回调开始执行时,MATLAB 会将 BeingDeleted
属性设置为 'on'
。BeingDeleted
属性将一直保持 'on'
设置状态,直到组件对象不再存在为止。
在查询或修改对象之前,请先检查其 BeingDeleted
属性的值,以确认它不是待删除项。
属性:
GetAccess | public |
SetAccess | protected |
GetObservable | true |
SetObservable | true |
Parent
— 父容器
Figure
对象 (默认) | Panel
对象 | Tab
对象 | GridLayout
对象
组件的父容器,指定为 Figure
、Panel
、Tab
或 GridLayout
对象。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
Dependent | true |
NonCopyable | true |
GetObservable | true |
SetObservable | true |
Children
— UI 组件子级
空 GraphicsPlaceholder
数组
UI 组件子级,以空 GraphicsPlaceholder
数组形式返回。自定义 UI 组件没有子级。设置此属性不会产生任何影响。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
Dependent | true |
NonCopyable | true |
HandleVisibility
— 对象句柄的可见性
'on'
(默认) | 'callback'
| 'off'
对象句柄的可见性,指定为 'on'
、'callback'
或 'off'
。
此属性控制对象在其父级的子级列表中的可见性。当对象未显示在其父级的子级列表中时,通过搜索对象层次结构或查询属性来获取对象的函数不会返回该对象。这些函数包括 get
、findobj
、clf
和 close
。对象即使在不可见时也有效。如果可以访问某个对象,则可以设置和获取其属性,并将其传递给针对对象进行运算的任意函数。
HandleVisibility 值 | 描述 |
---|---|
'on' | 对象始终可见。 |
'callback' | 对象对于回调或回调调用的函数可见,但对于命令行调用的函数不可见。此选项阻止通过命令行访问对象,但允许回调函数访问它。 |
'off' | 对象始终不可见。该选项用于防止另一函数无意中对 UI 进行更改。将 HandleVisibility 设置为 'off' 可在执行该函数时暂时隐藏对象。 |
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
Type
— UI 组件对象的类型
字符向量
UI 组件对象的类型,以包含组件名称的字符向量形式返回。
属性:
GetAccess | public |
SetAccess | protected |
NonCopyable | true |
Transient | true |
Tag
— 对象标识符
''
(默认) | 字符向量 | 字符串标量
对象标识符,指定为字符向量或字符串标量。您可以指定唯一的 Tag
值作为对象的标识符。如果需要访问您代码中其他位置的对象,可以使用 findobj
函数基于 Tag
值搜索对象。
属性:
GetAccess | public |
SetAccess | public |
Dependent | true |
GetObservable | true |
SetObservable | true |
UserData
— 用户数据
[]
(默认) | 数组
用户数据,指定为任何 MATLAB 数组。例如,您可以指定标量、向量、矩阵、元胞数组、字符数组、表或结构体。使用此属性存储对象上的任意数据。
如果您在 App 设计工具中工作,请在该 App 中创建公共或私有属性以共享数据,而不是使用 UserData
属性。有关详细信息,请参阅在用 App 设计工具创建的 App 内共享数据。
属性:
GetAccess | public |
SetAccess | public |
Transient | true |
GetObservable | true |
SetObservable | true |
示例
IP 地址输入
定义名为 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,5], ... 'RowHeight',{22},'ColumnWidth',{30,30,30,30,22},... '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',@(o,e) 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 = @(o,e) disp(['Value changed to: ', num2str(h.Value)]);
在编辑字段中输入 IP 地址 192.168.1.10
。MATLAB® 在命令行窗口中显示更新后的 IP 地址。
详细信息
为 UI 组件启用用户定义的回调
定义类时,可以选择为 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 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)