主要内容

以编程方式开发自定义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组件的用户界面。

私人物业街区
(推荐)

此块定义了用户无法访问的底层图形对象和其他实现细节。

在这个块中,设置这些属性值:

  • Access = private

  • 瞬态

  • NonCopyable

事件块
(可选)

这个块定义了这个UI组件将触发的事件。

在这个块中,设置这些属性值:

  • HasCallbackProperty

  • NotifyAccess = protected

当你设置HasCallbackProperty属性,MATLAB®为块中的每个事件创建一个公共属性。公共属性存储用户提供的在事件触发时执行的回调。

设置方法
(必需)

这个方法设置UI组件的初始状态。它在MATLAB构造对象时执行一次。

在protected中定义此方法方法块。

更新方法
(必需)

这个方法更新UI组件中的底层对象。它在以下条件下执行:

  • 在接下来的drawnow在用户更改一个或多个属性值之后执行

  • 当用户图形环境的某个方面发生变化时(例如大小)

方法在同一受保护块中定义此方法设置方法。

构造函数方法

类的构造函数方法中继承了构造函数方法,因此不必为类编写构造函数方法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”);结束
当用户创建UI组件的实例时,他们可以使用生成的public属性指定当颜色值发生变化时执行的回调。
F = ufigure;c = ColorSelector(f,“ValueChangedFcn”@ (o, e) disp (“改变”))
有关指定属性回调的详细信息,请参见为以编程方式创建的应用程序创建回调

设置方法

定义一个设置方法。一个设置方法在MATLAB构造UI组件对象时执行一次。任何作为名称-值参数传递给构造函数方法的属性值都是在该方法执行之后赋值的。

使用设置方法:

  • 创建组成组件的图形和UI对象。

  • 将对象存储为组件对象上的私有属性。

  • 布局和配置对象。

  • 连接对象以在组件中执行一些有用的操作。

定义设置方法。

大多数UI对象创建函数都有一个可选的input参数来指定父对象。从类方法中调用这些函数时,必须指定目标父函数。通过使用传递给方法的类实例参数,将目标父对象指定为正在设置的UI组件对象。

例如,考虑一个具有以下属性的UI组件:

  • 一个公共财产叫做价值

  • 三处名为网格按钮,EditField

设置方法调用uigridlayoutuieditfield,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

更新方法更新写成BackgroundColorEditField而且按钮中存储颜色的对象价值.的更新方法也会更新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路径下的文件夹中。按照以下步骤定义类。

一步 实现

ComponentContainer基类。

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结束

实现设置方法。在这种情况下,调用uigridlayoutuieditfield,uibutton要创建的函数GridLayoutEditField,按钮对象。将这些对象存储在相应的私有属性中。

指定getColorFromUser方法为ButtonPushedFcn当按下按钮时调用的回调函数。

方法(访问=受保护)函数设置(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克的);结束结束

使用私有方法将回调和其他部分连接在一起。

getColorFromUser方法由按钮按下触发,则调用uisetcolor函数打开颜色选择器,然后调用通知函数执行用户回调函数和侦听器函数。

getContrastingColor方法调用更新方法,计算黑色或白色文本在新的背景色上更可读。

方法(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(的颜色改变了);

显示黄色的颜色选择器UI组件的实例。

单击按钮并使用颜色选择器选择颜色。该组件改变外观和MATLAB显示文字颜色改变了在命令窗口。

显示蓝色的颜色选择器UI组件的实例。

另请参阅

功能

相关的话题

Baidu
map