查找对象
查找具有特定属性值的对象
findobj
函数可以扫描对象层次结构以获得具有特定属性值的对象句柄。
为便于标识,所有图形对象均具有可设为任意字符向量的 Tag
属性。您随后可以查找特定的属性/值对组。例如,假设创建了一个有时会在 UI 中停用的复选框。通过将唯一的值赋给 Tag
属性,您可以找到这个特定对象:
uicontrol('Style','checkbox','Tag','save option')
使用 findobj
找到 Tag
属性值设为 'save option
的对象并禁用它:
hCheckbox = findobj('Tag','save option'); hCheckbox.Enable = 'off'
如果未指定起始对象,findobj
会从根对象开始,查找所有出现您所指定的名称/属性值对组的对象。
要查找隐藏句柄对象,使用 findall
。
通过字符串属性查找文本
此示例说明如何使用 String
属性查找文本对象。
以下图形包含用于标记特定函数值的文本对象。
假设要将标记值 sin(t) = .707 的文本从其位于 [pi/4,sin(pi/4)]
的当前位置移动到函数具有相同值的点 [3*pi/4,sin(3*pi/4)]
(在图形中呈淡灰色显示)。
确定标记点 [pi/4,sin(pi/4)]
的文本对象句柄并更改其 Position
属性。
要使用 findobj
,选取能唯一标识该对象的属性值。此例使用文本 String
属性:
hText = findobj('String','\leftarrowsin(t) = .707');
将对象移动到新位置,以坐标区单位定义文本 Position
。
hText.Position = [3*pi/4,sin(3*pi/4),0];
使用 findobj
可通过指定层次结构中起始点来限制搜索,而不用从根对象开始。如果对象树中有很多对象,则此功能可以加快搜索速度。在前一示例中,您知道关注的文本对象在当前坐标区上,因此可以键入:
hText = findobj(gca,'String','\leftarrowsin(t) = .707');
使用含有 findobj 的正则表达式
此示例说明如何使用正则表达式找出特定的属性值,从而找到对象句柄。有关正则表达式的详细信息,请参阅 regexp
。
假设您创建了以下图形并想要修改所创建对象的某些属性。
x = 0:30; y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]'; h = stem(x,y); h(1).Marker = 'o'; h(1).Tag = 'Decaying Exponential'; h(2).Marker = 'square'; h(2).Tag = 'Growing Exponential'; h(3).Marker = '*'; h(3).Tag = 'Steady State';
将正则表达式传递给 findobj
可以匹配特定模式。例如,假设您想要将 Tag
属性未设置成 'Steady State'
的所有针状图对象(即表示衰减和增长指数的针状图)的 MarkerFaceColor
属性的值设置成绿色。
hStems = findobj('-regexp','Tag','^(?!Steady State$).'); for k = 1:length(hStems) hStems(k).MarkerFaceColor = 'green' end
限制搜索范围
指定对象树中的起始点可以限制搜索范围。起始点可以是图窗、坐标区的句柄或一组对象句柄。
例如,假设您想要更改特定坐标区中针状图的标记面颜色:
x = 0:30; y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]'; tiledlayout(3,1) ax1 = nexttile; stem(x,y(:,1)) ax2 = nexttile; stem(x,y(:,2)) ax3 = nexttile; stem(x,y(:,3))
只设置第三个坐标区上针状图的标记面颜色。
h = findobj(ax3,'Type','stem'); h.MarkerFaceColor = 'red';