主要内容

开发自定义UI组件编程

创建自定义用户界面和可视化,可以结合多个图形和UI对象,改变它们的属性,或调用其他函数。R2020a和更早的版本中,一个常见的方式来存储您的定制代码和与他人分享是编写一个脚本或一个函数。

从R2020b开始,而不是一个脚本或函数,您可以创建一个类实现UI组件定义的一个子类ComponentContainer基类。创建一个类有这些好处:

  • 容易定制——当用户想定制UI组件的一个方面,他们可以设置一个属性,而不必修改并重新运行您的代码。用户可以修改属性在命令行或检查在属性检查器。

  • 封装,以这种方式组织代码允许您从您的用户隐藏实现细节。实现方法,执行计算和管理底层的图形对象。

这一主题的概述的步骤创建一个定制的UI组件通过定义一个类以编程方式。另外,从R2022a开始,您可以创建一个定制的UI组件交互地使用应用程序设计师。关于交互式方法的更多信息,请参阅创建一个简单的自定义UI组件在应用程序设计师

UI组件类的结构

UI组件类有几个必需的部分,和几个可选的。

在UI组件类,第一行指定matlab.ui.componentcontainer.ComponentContainer类的超类。例如,第一行类的调用ColorSelector是这样的:

classdefColorSelector < matlab.ui.componentcontainer.ComponentContainer

除了指定父类,在类定义中包含以下组件。有些组件是必需的,而其他组件都推荐或可选的。

组件 描述

公共财产块
(推荐)

这个块定义的所有属性,用户可以访问。在一起,这些属性的用户界面UI组件。

私有财产块
(推荐)

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

在这一块,设置这些属性值:

  • 访问=私人

  • 瞬态

  • NonCopyable

事件块
(可选)

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

在这一块,设置这些属性值:

  • HasCallbackProperty

  • NotifyAccess =保护

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

设置方法
(必需)

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

在一个受保护的定义这个方法方法块。

更新方法
(必需)

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

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

  • 当用户的图形环境变化的一个方面(如大小)

定义这个方法在同一块作为保护设置方法。

构造函数方法

你没有写构造函数方法为你的类,因为它继承的ComponentContainer基类。继承的构造函数接受可选的输入参数:一个父容器和任意数量的名称-值对参数设置属性的UI组件。例如,如果你定义一个类调用ColorSelector公共属性价值ValueChangedFcn,您可以创建您的类的一个实例使用这段代码:

f = uifigure;c = ColorSelector (f,“价值”(1 1 0),“ValueChangedFcn”@ (o, e) disp (“改变”))

如果你想提供一个构造函数,有不同的语法或不同的行为,您可以定义一个自定义构造函数方法。一个自定义构造函数的一个例子,看到编写表类的构造函数

公共和私人财产

把你的至少两个街区之间的类属性:

  • 公共块用于存储面向用户界面的组件

  • 一个私人块用于存储你想隐藏的实现细节

在公共的属性块存储用户提供的输入值。例如,一个UI组件,允许用户选择一个颜色值可能会将颜色值存储在一个公共的财产。因为属性名称-值对参数是可选的输入隐式的构造函数方法,推荐的方法是初始化公共属性的默认值。

在私人的属性块存储底层图形对象构成你的UI组件,除了要存储的任何计算值。最终,你的类将使用公共属性配置底层中的数据对象。设置瞬态NonCopyable属性为私营块以避免存储冗余信息如果用户拷贝或节省UI组件的一个实例。

例如,下面是属性块UI组件,允许用户选择一个颜色值。公共财产的块存储值,用户可以控制:颜色值。私有财产的块存储网格布局管理器,按钮,编辑字段的对象。

属性价值{validateattributes(价值,{“双重”},{“< =”,1,“> =”,0,“大小”,[1 3]})}= (1 0 0);结束属性(=私人访问,瞬态NonCopyable)网格matlab.ui.container.GridLayout按钮matlab.ui.control.ButtonEditFieldmatlab.ui.control.EditField结束

事件块

你还可以添加一个第三块UI组件触发的事件。

为每个事件创建一个公共财产通过指定的块HasCallbackProperty属性。公共财产存储用户提供的回调事件触发时执行。公共财产的名称是事件附加的名字的字母Fcn。例如,一个UI组件,允许用户选择一个颜色值可能定义事件ValueChanged,生成相应的公共财产ValueChangedFcn。使用通知方法和执行触发事件回调的财产。

例如,这是事件块的UI组件允许用户选择一个颜色值。

事件ValueChanged (HasCallbackProperty NotifyAccess =保护)结束
当用户选择一个颜色值,调用通知方法以火ValueChanged事件和执行的回调ValueChangedFcn财产。
函数getColorFromUser (comp) c = uisetcolor (comp.Value);如果(isscalar (c) & & (c = = 0))返回;结束%更新属性值oldValue = comp.Value;comp.Value = c;%用户执行回调函数和听众通知(排版,“ValueChanged”);结束
当一个用户创建UI组件的一个实例,可以指定一个颜色值改变时执行回调使用生成的公共财产。
f = uifigure;c = ColorSelector (f,“ValueChangedFcn”@ (o, e) disp (“改变”))
关于指定回调属性的更多信息,请参阅为应用程序创建回调以编程方式创建

设置方法

定义一个设置您的类的方法。一个设置方法执行当MATLAB构建UI组件对象。任何属性值作为名称的参数传递给构造函数方法该方法执行后被分配。

使用设置方法:

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

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

  • 布局和配置对象。

  • 连接中的对象来做一些有用的组件。

定义设置方法在一个受保护的代码块。

大多数UI对象创建函数有一个可选的输入参数用于指定父。当您调用这些函数在一个类方法,您必须指定目标的父母。指定目标父的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.Grid,“可编辑”假的,“HorizontalAlignment”,“中心”);%创建按钮来确认颜色改变comp.Button = uibutton (comp.Grid,“文本”char (9998),“ButtonPushedFcn”@ (o, e) comp.getColorFromUser ());结束

更新方法

定义一个更新您的类的方法。这个方法执行当UI组件对象需要改变其外观以响应的变化值。

使用更新方法重新配置底层图形对象在你的UI组件基于公共属性的新值。通常,这种方法不确定哪些公共属性的改变。重新配置底层图形对象的各个方面,依赖于公共属性。

例如,考虑一个UI组件,这些属性:

  • 一种公共财产价值

  • 三个私人属性叫做网格,按钮,EditField

更新方法的更新写成BackgroundColorEditField按钮存储在对象的颜色价值。的更新方法也更新EditField对象的数字表示颜色。然而,这种方式价值是改变,改变变得同样随处可见。

函数更新(薪酬)%更新编辑字段和按钮的颜色设置([排版。EditField电脑及相关知识。按钮],“写成BackgroundColor”comp.Value,“FontColor”comp.getContrastingColor (comp.Value));%更新编辑字段显示文本comp.EditField。价值= num2str(comp.Value,% 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 =保护)% ValueChangedFcn将生成的回调的财产结束

定义私有财产。

属性(=私人访问,瞬态NonCopyable)网格matlab.ui.container.GridLayout按钮matlab.ui.control.ButtonEditFieldmatlab.ui.control.EditField结束

实现设置方法。在这种情况下,调用uigridlayout,uieditfield,uibutton函数创建GridLayout,EditField,按钮对象。这些对象存储在相应的私有财产。

指定getColorFromUser方法的ButtonPushedFcn按钮被按下时调用的回调。

方法(访问=保护)函数设置(comp)%管理构建块网格布局comp.Grid = uigridlayout (comp (1、2),“ColumnWidth”,{“1 x”22},“RowHeight”,{“健康”},“列空间”2,“填充”2);%编辑字段的值显示和按钮来启动uisetcolorcomp.EditField = uieditfield (comp.Grid,“可编辑”假的,“HorizontalAlignment”,“中心”);comp.Button = uibutton (comp.Grid,“文本”char (9998),“ButtonPushedFcn”@ (o, e) comp.getColorFromUser ());结束

实现更新方法。在这种情况下,更新底层对象的背景颜色和文本编辑字段显示颜色值。

函数更新(薪酬)%更新编辑字段和按钮的颜色设置([排版。EditField电脑及相关知识。按钮],“写成BackgroundColor”comp.Value,“FontColor”comp.getContrastingColor (comp.Value));%更新显示文本comp.EditField。价值= num2str(comp.Value,% 0.2克的);结束结束

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

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

getContrastingColor方法被调用的更新方法,计算是否黑色或白色文本更具可读性的背景颜色。

方法(访问=私人)函数getColorFromUser (comp) c = uisetcolor (comp.Value);如果(isscalar (c) & & (c = = 0))返回;结束%更新属性值comp.Value = c;%用户执行回调函数和听众通知(排版,“ValueChanged”);结束函数颜色contrastColor = getContrastingColor (~)%计算相反的颜色c =颜色* 255;contrastColor = (1 1 1);如果(c (1) *。299 + c (2) *。587 + c (3) * .114) > 186 contrastColor = [0 0 0];结束结束结束结束

接下来,创建一个UI组件的实例通过调用构造函数隐式方法的一些公共属性。指定一个回调显示文字颜色改变了当颜色值的变化。

h = ColorSelector (“价值”,(1 1 0));h。ValueChangedFcn = @ (o, e) disp (的颜色改变了);

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

单击按钮使用颜色选择器,并选择一个颜色。组件更改外观和MATLAB显示单词颜色改变了在命令窗口中。

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

另请参阅

功能

相关的话题