Main Content

查找对象

查找具有特定属性值的对象

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';

有关限制搜索及对象搜索深度的详细信息,请参阅 findobjfindall