以编程方式开发自定义UI组件
要创建自定义UI和可视化,您可以组合多个图形和UI对象,更改它们的属性,或调用其他函数。在R2020a和更早的版本中,存储定制代码并与其他人共享的常用方法是编写脚本或函数。
类的子类,可以为UI组件创建类实现,从R2020b开始不再使用脚本或函数ComponentContainer
基类。创建类有以下好处:
易于定制——当用户想要定制UI组件的某个方面时,他们可以设置一个属性,而不必修改并重新运行代码。用户可以在命令行上修改属性,也可以在属性检查器中检查属性。
封装——以这种方式组织代码可以让你对用户隐藏实现细节。实现执行计算和管理底层图形对象的方法。
本主题概述了通过编程方式定义类来创建自定义UI组件的步骤。或者,从R2022a开始,您可以使用App Designer交互式地创建一个自定义UI组件。有关交互式方法的更多信息,请参见在应用设计器中创建一个简单的自定义UI组件.
UI组件类的结构
UI组件类有几个必需的部分,还有几个可选的部分。
在UI组件类的第一行中,指定matlab.ui.componentcontainer.ComponentContainer
类作为超类。例如,类的第一行ColorSelector
看起来是这样的:
classdefColorSelector < matlab.ui.componentcontainer.ComponentContainer
除了指定超类外,还需要在类定义中包含以下组件。有些组件是必需的,而其他组件是推荐的或可选的。
组件 | 描述 |
---|---|
公共物业街区 |
这个块定义了用户可以访问的所有属性。这些属性一起构成了UI组件的用户界面。 |
私人物业街区 |
此块定义了用户无法访问的底层图形对象和其他实现细节。 在这个块中,设置这些属性值:
|
事件块 |
这个块定义了这个UI组件将触发的事件。 在这个块中,设置这些属性值:
当你设置 |
|
这个方法设置UI组件的初始状态。它在MATLAB构造对象时执行一次。 在protected中定义此方法 |
|
这个方法更新UI组件中的底层对象。它在以下条件下执行:
方法在同一受保护块中定义此方法 |
构造函数方法
类的构造函数方法中继承了构造函数方法,因此不必为类编写构造函数方法ComponentContainer
基类。继承的构造函数接受可选的输入参数:父容器和任意数量的名值对参数,用于在UI组件上设置属性。例如,如果定义一个名为ColorSelector
它具有公共属性价值
而且ValueChangedFcn
,你可以使用下面的代码创建你的类的实例:
F = ufigure;c = ColorSelector(f,“价值”,[1 10 0],“ValueChangedFcn”@ (o, e) disp (“改变”))
如果希望提供具有不同语法或不同行为的构造函数,可以定义自定义构造函数方法。有关自定义构造函数的示例,请参见为图表类编写构造函数.
公共及私人物业大厦
将你的类属性至少划分为两个块:
一个公共块,用于存储面向用户界面的组件
用于存储要隐藏的实现细节的私有块
公共块中的属性存储用户提供的输入值。例如,允许用户选择颜色值的UI组件可能会将颜色值存储在公共属性中。由于属性名-值对参数是隐式构造函数方法的可选输入,因此推荐的方法是将公共属性初始化为默认值。
私有块中的属性存储组成UI组件的底层图形对象,以及您想存储的任何计算值。最终,您的类将使用公共属性中的数据来配置底层对象。设置瞬态
而且NonCopyable
如果用户复制或保存UI组件的实例,则私有块的属性将避免存储冗余信息。
例如,下面是UI组件的属性块,允许用户选择颜色值。public属性块存储用户可以控制的值:颜色值。私有属性块存储网格布局管理器、按钮和编辑字段对象。
属性价值{validateattributes(价值,...{“双重”},{“< =”,1,' > = ',0,“大小”,[1 3]})}= [1 0 0];结束属性(访问=私有,瞬态,不可复制)网格matlab.ui.container.GridLayout按钮matlab.ui.control.ButtonEditFieldmatlab.ui.control.EditField结束
事件块
您还可以为UI组件触发的事件添加第三个块。
属性为块中的每个事件创建公共属性HasCallbackProperty
属性。公共属性存储用户提供的在事件触发时执行的回调。公共属性的名称是附加字母的事件名称Fcn
.例如,允许用户选择颜色值的UI组件可以定义事件ValueChanged
,生成相应的公共属性ValueChangedFcn
.使用通知
方法来触发事件并执行属性中的回调。
例如,这是一个UI组件的事件块,允许用户选择颜色值。
事件ValueChanged . (HasCallbackProperty, NotifyAccess = protected结束
通知
方法来触发ValueChanged
事件中执行回调ValueChangedFcn
财产。函数getColorFromUser(comp) c = uisetcolor(comp. value);如果(isscalar(c) && (c == 0))返回;结束更新Value属性oldValue = comp.Value;comp.Value = c;执行用户回调和监听器通知(排版,“ValueChanged”);结束
F = ufigure;c = ColorSelector(f,“ValueChangedFcn”@ (o, e) disp (“改变”))
设置方法
定义一个设置
方法。一个设置
方法在MATLAB构造UI组件对象时执行一次。任何作为名称-值参数传递给构造函数方法的属性值都是在该方法执行之后赋值的。
使用设置
方法:
创建组成组件的图形和UI对象。
将对象存储为组件对象上的私有属性。
布局和配置对象。
连接对象以在组件中执行一些有用的操作。
定义设置
方法。
大多数UI对象创建函数都有一个可选的input参数来指定父对象。从类方法中调用这些函数时,必须指定目标父函数。通过使用传递给方法的类实例参数,将目标父对象指定为正在设置的UI组件对象。
例如,考虑一个具有以下属性的UI组件:
一个公共财产叫做
价值
三处名为
网格
,按钮
,EditField
的设置
方法调用uigridlayout
,uieditfield
,uibutton
函数为每个私有属性创建底层图形对象,指定UI组件的实例(电脑及相关知识
)作为目标父节点。
函数设置(comp)创建网格布局来管理构建块comp. grid = uigridlayout(comp,[1 2],“ColumnWidth”, {“1 x”22},...“RowHeight”, {“健康”},“列空间”2,“填充”2);创建用于输入颜色值的编辑字段comp. editfield = uieditfield(comp. editfield)网格,“可编辑”假的,...“HorizontalAlignment”,“中心”);%创建按钮确认颜色变化comp. button = uibutton(comp. button)网格,“文本”char (9998),...“ButtonPushedFcn”@ (o, e) comp.getColorFromUser ());结束
更新方法
定义一个更新
方法。当您的UI组件对象需要更改其外观以响应值的更改时,将执行此方法。
使用更新
方法根据公共属性的新值重新配置UI组件中的底层图形对象。通常,此方法不确定更改了哪些公共属性。它重新配置依赖于公共属性的底层图形对象的所有方面。
例如,考虑一个具有以下属性的UI组件:
一个公共财产叫做
价值
三处名为
网格
,按钮
,EditField
的更新
方法更新写成BackgroundColor
的EditField
而且按钮
中存储颜色的对象价值
.的更新
方法也会更新EditField
对象的颜色的数字表示形式。但是,这样做价值
改变了,改变就变得随处可见。
函数更新(薪酬)更新编辑字段和按钮颜色设置([排版。EditField电脑及相关知识.按钮],“写成BackgroundColor”广告样稿。值,...“FontColor”comp.getContrastingColor (comp.Value));更新编辑字段显示文本comp. editfield . value = num2str(comp. editfield . value = num2str)值,% 0.2克的);结束
在更改属性值和看到这些更改的结果之间可能会有延迟。的更新
方法后首次运行设置
方法运行,然后它每次都运行drawnow
执行。的drawnow
函数会根据用户MATLAB会话中的图形环境状态定期自动执行。这种周期性的执行可能会导致潜在的延迟。
示例:颜色选择器UI组件
这个例子展示了如何使用本页其他部分讨论的代码创建一个用于选择颜色的UI组件。创建名为ColorSelectorComponent.m
在MATLAB路径下的文件夹中。按照以下步骤定义类。
一步 | 实现 |
---|---|
从 |
classdefColorSelector < matlab.ui.componentcontainer.ComponentContainer
|
定义公共属性。 |
属性价值{validateattributes(价值,...{“双重”},{“< =”,1,' > = ',0,“大小”,[1 3]})}= [1 0 0];结束 |
定义公共事件。 |
事件ValueChanged . (HasCallbackProperty, NotifyAccess = protected% ValueChangedFcn将是生成的回调属性结束 |
定义私有属性。 |
属性(访问=私有,瞬态,不可复制)网格matlab.ui.container.GridLayout按钮matlab.ui.control.ButtonEditFieldmatlab.ui.control.EditField结束 |
实现 指定 |
方法(访问=受保护)函数设置(comp)%网格布局来管理构建块comp. grid = uigridlayout(comp,[1,2],“ColumnWidth”, {“1 x”22},...“RowHeight”, {“健康”},“列空间”2,“填充”2);%编辑字段值显示和按钮启动uisetcolorcomp. editfield = uieditfield(comp. editfield)网格,“可编辑”假的,...“HorizontalAlignment”,“中心”);comp. button = uibutton(comp. button)网格,“文本”char (9998),...“ButtonPushedFcn”@ (o, e) comp.getColorFromUser ());结束 |
实现 |
函数更新(薪酬)更新编辑字段和按钮颜色设置([排版。EditField电脑及相关知识.按钮],“写成BackgroundColor”广告样稿。值,...“FontColor”comp.getContrastingColor (comp.Value));更新显示文本comp. editfield . value = num2str(comp. editfield . value = num2str)值,% 0.2克的);结束结束 |
使用私有方法将回调和其他部分连接在一起。 当 当 |
方法(Access = private)函数getColorFromUser(comp) c = uisetcolor(comp. value);如果(isscalar(c) && (c == 0))返回;结束更新Value属性comp.Value = c;执行用户回调和监听器通知(排版,“ValueChanged”);结束函数contastcolor = getContrastingColor(~,color)%计算相反色C = color * 255;compastcolor = [1 1 1];如果(c(1) *。299 + c(2)*。587 + c(3)*.114) > 186对比度= [0 0 0 0];结束结束结束结束 |
接下来,通过使用一些公共属性调用隐式构造函数方法来创建UI组件的实例。指定一个回调来显示单词颜色改变了
当颜色值发生变化时。
h = ColorSelector(“价值”, [1 10 0]);h.ValueChangedFcn = @(o,e) disp(的颜色改变了);
单击按钮并使用颜色选择器选择颜色。该组件改变外观和MATLAB显示文字颜色改变了
在命令窗口。