以编程方式管理自定义UI组件的属性
类的子类开发自定义UI组件时ComponentContainer
基类时,可以使用某些技术使代码更加健壮、高效和用户友好。这些技术侧重于如何定义和管理类的属性。使用任何对您想要创建的组件类型和您想要提供的用户体验有帮助的参数。
有关这些技术的示例,请参见示例:具有自定义属性显示的优化多项式拟合UI组件.
此外,如果你想在App Designer中使用你的自定义UI组件,或者与在App Designer中开发应用的用户共享你的组件,还有一些注意事项和限制需要记住。这些注意事项在单独的页面中列出为应用程序设计器配置自定义UI组件.
初始化属性值
为类的所有公共属性指定默认值。这允许MATLAB创建一个有效的UI组件,即使用户在调用构造函数方法时省略了一些名称-值参数。
对于包含图表并具有存储坐标数据的属性的UI组件,将初始值设置为南
值或空数组,以便在用户未指定坐标时默认图表为空。
验证属性值
在您的代码使用属性值之前,请确认它们具有正确的大小和类。例如,这个属性块验证三个属性的大小和类。
属性LineColor{validateattributes (LineColor{“双重”},...{“< =”1”> = ',0,“大小”,[1 3]})}= [1 0 0] XData(: 1)增加一倍= NaN YData(: 1)增加一倍=南结束
LineColor
必须是一个1乘3的类数组双
,其中每个值都在范围内[0, 1]
.这两个XData
而且YData
一定是同一类的行向量双
.
您还可以验证在UI组件中存储底层组件对象的属性。为此,您需要知道每个对象的正确类名。要确定对象的类名,请在命令行调用相应的UI组件函数,然后调用类
函数获取类名。例如,如果您计划在您的设置
方法,调用uidropdown
函数在命令行上使用输出参数。然后,将输出传递给类
函数获取其类名。
Dd = uidropdown;类(d)
ans = 'matlab.ui.control.DropDown'
方法的输出类
函数验证类中相应属性的类。在属性名之后指定类。例如,下面的属性存储下拉
对象并验证其类。
属性(访问=私有,瞬态,不可复制)下拉matlab.ui.control.DropDown结束
有时,您可能希望定义一个属性,该属性可以存储不同形状和类的值。例如,如果定义的属性可以存储字符向量、字符向量的单元格数组或字符串数组,则省略大小和类验证或使用自定义属性验证方法。有关验证属性的详细信息,请参见验证属性值.
自定义属性显示
类的子类定义UI组件的好处之一是ComponentContainer
类继承的matlab.mixin.CustomDisplay
类。这允许您自定义MATLAB属性列表®当你引用UI组件时不带分号,会显示在命令窗口中。属性的重载可自定义属性显示getPropertyGroups
方法。在该方法中,您可以自定义列出哪些属性以及列表的顺序。例如,考虑一个FitPlot
类,该类具有以下公共属性。
属性LineColor{validateattributes (LineColor{“双重”},...{“< =”1”> = ',0,“大小”,[1 3]})}= [1 0 0] XData(: 1)增加一倍= NaN YData(: 1)增加一倍=南结束
以下getPropertyGroups
方法将标量对象属性列表指定为XData
,YData
,LineColor
.
函数propgrp = getPropertyGroups(comp)如果~ isscalar (comp)对象数组的%列表propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(comp);其他的标量对象的%列表propList = {“XData”,“YData”,“LineColor”};propgrp = matlab.mix .util. propertygroup (propList);结束结束
当用户引用不带分号的此UI组件实例时,MATLAB将显示自定义列表。
p = FitPlot
p =FitPlot属性:XData: NaN YData: NaN LineColor: [1 0 0]
有关自定义属性显示的详细信息,请参见自定义属性显示.
优化更新
方法
在大多数情况下,更新
方法重新配置UI组件中依赖于public属性的所有相关方面。有时,重新配置涉及一个昂贵的计算,是耗时的。如果计算只涉及属性的一个子集,则可以将类设计为仅在必要时执行该代码。
优化的一种方法更新
方法将这些元素添加到类中:
一个私人财产叫做
ExpensivePropChanged
它接受逻辑
价值。此属性指示开销计算中使用的任何属性是否已更改。一个
集
方法,用于计算所涉及的每个属性。在每一个集
方法,将ExpensivePropChanged
财产真正的
.一个受保护的方法
doExpensiveCalculation
这执行了昂贵的计算。类中的条件语句
更新
的值ExpensivePropChanged
.如果值为真正的
、执行doExpensiveCalculation
.
下面的代码提供了这个设计的模板。
classdefOptimizedUIComponent < matlab.ui.componentcontainer.ComponentContainer属性Prop1 Prop2结束属性(=私人访问,瞬态NonCopyable) ExpensivePropChanged(1)逻辑= true结束方法(访问=受保护)函数设置(comp)配置UI组件%……结束函数更新(薪酬)如果需要,执行昂贵的计算如果comp.ExpensivePropChanged doExpensiveCalculation (comp);comp.ExpensivePropChanged = false;结束更新UI组件的其他方面%……结束函数doExpensiveCalculation (comp)%昂贵的代码%……结束结束方法函数set.Prop2(comp,val) comp. prop2 = val;comp.ExpensivePropChanged = true;结束结束结束
在这种情况下,Prop2
涉及到昂贵的计算。的集。Prop2
方法设置的值Prop2
,然后就凝固了ExpensivePropChanged
来真正的
.下一次更新
方法运行,它调用doExpensiveCalculation
只有在ExpensivePropChanged
是真正的
.然后,更新
方法继续更新UI组件的其他方面。
示例:具有自定义属性显示的优化多项式拟合UI组件
此示例定义了FitPlot
类用于交互显示最佳拟合多项式,并使用所有这四个最佳实践。属性块中定义的属性具有默认值,并使用大小和类验证。的getPropertyGroups
方法定义属性显示的自定义顺序。的changeFit
方法执行可能代价高昂的多项式拟合计算,而更新
方法执行changeFit
仅当绘制的数据发生变化时。
要定义这个类,请保存FitPlot
类定义到一个名为FitPlot.m
在MATLAB路径下的文件夹中。
classdefFitPlot < matlab.ui.componentcontainer.ComponentContainer为绘制的数据选择合适的方法。属性LineColor{validateattributes (LineColor{“双重”},...{“< =”1”> = ',0,“大小”,[1 3]})}= [1 0 0] XData(: 1)增加一倍= NaN YData(: 1)增加一倍=南结束属性(访问=私有,瞬态,不可复制)下拉matlab.ui.control.DropDown轴matlab.ui.control.UIAxesGridLayoutmatlab.ui.container.GridLayoutDataLine(1,1) matlab.graphics.chart.primitive.LineFitLine(1,1) matlab.graphics.chart.primitive.LineFitXData(: 1)增加一倍FitYData(: 1)增加一倍ExpensivePropChanged(1)逻辑= true结束方法(访问=保护)函数设置(comp)设置该组件的初始位置comp.Position = [100 100 300 300];创建网格布局、下拉菜单和轴comp. gridlayout = uigridlayout(comp,[2,1],...“RowHeight”{20日,“1 x”},...“ColumnWidth”, {“1 x”});comp. dropdown = uidropdown(comp. dropdown)GridLayout,...“项目”, {“没有”,“线性”,“二次”,“立方”},...“ValueChangedFcn”@(年代,e) changeFit (comp));comp.Axes = uiaxes(comp.GridLayout);创建行对象comp. dataline = plot(comp. dataline = plot)轴,南南“o”);(排版。轴,“上”);comp.FitLine = plot(comp.Axes,NaN,NaN);(排版。轴,“关闭”);结束函数更新(薪酬)更新数据点comp. datline . xdata = comp.XData;comp. datline . ydata = comp.YData;做一个昂贵的手术如果comp.ExpensivePropChanged comp.changeFit ();comp.ExpensivePropChanged = false;结束更新匹配行comp.FitLine.Color = comp.LineColor;comp.FitLine.XData = comp.FitXData;comp.FitLine.YData = comp.FitYData;结束函数changeFit (comp)%根据下拉值计算拟合线如果比较字符串(comp.DropDown.Value“没有”) comp.FitXData = NaN;comp.FitYData = NaN;其他的开关comp.DropDown.Value情况下“线性”f = polyfit(comp.XData,comp.YData,1);情况下“二次”f = polyfit(comp.XData,comp.YData,2);情况下“立方”f = polyfit(comp.XData,comp.YData,3);结束comp.FitXData = linspace(min(comp.XData),max(comp.XData));comp.FitYData = polyval(f,comp.FitXData);结束结束函数propgrp = getPropertyGroups(comp)如果~ isscalar (comp)对象数组的%列表propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(comp);其他的标量对象的%列表propList = {“XData”,“YData”,“LineColor”};propgrp = matlab.mix .util. propertygroup (propList);结束结束结束方法函数set.XData(comp,val)comp.ExpensivePropChanged = true;结束函数set.YData(comp,val) comp. ydata = val;comp.ExpensivePropChanged = true;结束结束结束
定义一些样例数据并使用它创建的实例FitPlot
.
X = [0 0.3 0.8 1.1 1.6 2.3];Y = [0.6 0.67 1.01 1.35 1.47 1.25];p = FitPlot(“XData”, x,“YData”, y)
ans =FitPlot与属性:XData: [1×43 double] YData: [1×43 double] LineColor: [1 0 0]
使用下拉菜单显示二次最佳拟合曲线。
设置LineColor
属性将最佳拟合曲线的颜色更改为绿色。
p.LineColor = [0 0.5 0];