主要内容

TreeNode

树节点 UI 组件

  • Tree node UI component

说明

树节点 UI 组件在 App 内的树层次结构中显示项目。在创建树节点后,使用 TreeNode 对象修改其外观和行为。

创建对象

使用 uitreenode 函数在 App 中创建一个树节点。

属性

全部展开

节点

节点文本,指定为字符向量或字符串标量。

节点数据,指定为任何类型的数组。指定 NodeData,以便在 App 代码中共享与节点相关的数据。

图标源或文件,指定为字符向量、字符串标量或 m×n×3 真彩色图像数组。如果指定文件名,它可以是 MATLAB® 路径中的图像文件名或图像文件的完整路径。如果您计划与他人共享某个 App,请将图像文件放在 MATLAB 路径中以便于打包 App。

支持的图像格式包括 JPEG、PNG、GIF、SVG 或 m×n×3 真彩色图像数组。有关真彩色图像数组的详细信息,请参阅在 MATLAB 中使用图像类型

示例: 'icon.png' 指定 MATLAB 路径中的图标文件。

示例: 'C:\Documents\icon.png' 指定图像文件的完整路径。

交互性

上下文菜单,指定为使用 uicontextmenu 函数创建的 ContextMenu 对象。使用此属性可在您右键点击组件时显示上下文菜单。

回调

对象创建函数,指定为下列值之一:

  • 函数句柄。

  • 第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。

  • 包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。

有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调

此属性指定要在 MATLAB 创建对象时执行的回调函数。MATLAB 将在执行 CreateFcn 回调之前初始化所有属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。

对现有组件设置 CreateFcn 属性没有任何作用。

如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问正在创建的对象。否则,使用 gcbo 函数访问该对象。

对象删除函数,指定为下列值之一:

  • 函数句柄。

  • 第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。

  • 包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。

有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调

此属性指定在 MATLAB 删除对象时要执行的回调函数。MATLAB 在销毁对象的属性之前执行 DeleteFcn 回调。如果不指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。

如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问要删除的对象。否则,使用 gcbo 函数访问该对象。

回调执行控件

回调中断,指定为 'on''off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。

此属性确定是否可以中断运行中回调。有以下两种回调状态要考虑:

  • 运行中回调是当前正在执行的回调。

  • 中断回调是试图中断运行中回调的回调。

每次执行处理回调队列的命令时,MATLAB 都会确定回调中断行为。这些命令包括 drawnowfigureuifiguregetframewaitforpause

如果运行中回调不包含上述命令之一,则不会发生中断。MATLAB 首先完成执行运行中回调,然后执行中断回调。

如果运行中回调确实包含上述命令之一,则由运行中回调所属对象的 Interruptible 属性来确定是否发生中断:

  • 如果 Interruptible 的值为 'off',则不会发生中断。此时,由中断回调所属对象的 BusyAction 属性确定中断回调是被丢弃还是添加到回调队列中。

  • 如果 Interruptible 的值为 'on',则发生中断。下次 MATLAB 处理回调队列时,它会停止运行中回调的执行,并执行中断回调。在中断回调完成后,MATLAB 将继续执行运行中回调。

注意

回调的中断和执行在以下情况下会有不同的表现:

  • 如果中断回调是 DeleteFcnCloseRequestFcnSizeChangedFcn 回调,则无论是否存在 Interruptible 属性值都会发生中断。

  • 如果运行中回调当前正在执行 waitfor 函数,则无论是否存在 Interruptible 属性值都会发生中断。

  • 如果中断回调由 Timer 对象所有,则回调将根据调度执行,而不考虑 Interruptible 属性值。

注意

发生中断时,MATLAB 不保存属性状态或显示内容。例如,gcagcf 命令返回的对象可能会在另一个回调执行时发生改变。

回调排队,指定为 'queue''cancel'BusyAction 属性决定 MATLAB 如何处理中断回调的执行。有以下两种回调状态要考虑:

  • 运行中回调是当前正在执行的回调。

  • 中断回调是试图中断运行中回调的回调。

BusyAction 属性仅在同时满足以下两个条件时才确定回调排队行为:

在这些情况下,由中断回调所属对象的 BusyAction 属性确定 MATLAB 如何处理中断回调。以下是 BusyAction 属性的可能值:

  • 'queue' - 将中断回调放入队列中,以便在运行中回调执行完毕后进行处理。

  • 'cancel' - 不执行中断回调。

此 属性 为只读。

删除状态,以 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值形式返回。

DeleteFcn 回调开始执行时,MATLAB 会将 BeingDeleted 属性设置为 'on'BeingDeleted 属性将一直保持 'on' 设置状态,直到组件对象不再存在为止。

在查询或修改对象之前,请先检查其 BeingDeleted 属性的值,以确认它不是待删除项。

父级/子级

父对象,指定为 TreeTreeNode 对象。

子级,以 TreeNode 对象数组形式返回。

不能使用 Children 属性添加或删除子级,但可以使用此属性查看子级列表。子级的顺序反映了显示在屏幕上的子级节点的顺序。要向该列表中添加子级,请将子组件的 Parent 属性设置为 TreeNode 对象。

要重新排序子级,请使用 move 函数。

HandleVisibility 属性设置为 'off' 的对象不会列在 Children 属性中。

对象句柄的可见性,指定为 'on''callback''off'

此属性控制对象在其父级的子级列表中的可见性。当对象未显示在其父级的子级列表中时,通过搜索对象层次结构或查询属性来获取对象的函数不会返回该对象。这些函数包括 getfindobjclfclose。对象即使在不可见时也有效。如果可以访问某个对象,则可以设置和获取其属性,并将其传递给针对对象进行运算的任意函数。

HandleVisibility 值描述
'on'对象始终可见。
'callback'对象对于回调或回调调用的函数可见,但对于命令行调用的函数不可见。此选项阻止通过命令行访问对象,但允许回调函数访问它。
'off'对象始终不可见。该选项用于防止另一函数无意中对 UI 进行更改。将 HandleVisibility 设置为 'off' 可在执行该函数时暂时隐藏对象。

标识符

此 属性 为只读。

图形对象的类型,以 'uitreenode' 形式返回。

对象标识符,指定为字符向量或字符串标量。您可以指定唯一的 Tag 值作为对象的标识符。如果需要访问您代码中其他位置的对象,可以使用 findobj 函数基于 Tag 值搜索对象。

用户数据,指定为任何 MATLAB 数组。例如,您可以指定标量、向量、矩阵、元胞数组、字符数组、表或结构体。使用此属性存储对象上的任意数据。

如果您在 App 设计工具中工作,请在该 App 中创建公共或私有属性以共享数据,而不是使用 UserData 属性。有关详细信息,请参阅在用 App 设计工具创建的 App 内共享数据

对象函数

expand展开树节点
collapse折叠树节点
move移动树节点

示例

全部折叠

创建一个按运动项目分组显示运动员姓名的 App。当 App 用户点击一个姓名时,MATLAB 会显示该运动员的相关数据。

创建一个名为 mytreeapp.m 的程序文件,并在其中包含下列代码,以创建树、一组嵌套的树节点和一个回调函数。SelectionChangedFcn 属性指定当用户点击树中的节点时要执行的函数。

function mytreeapp
    fig = uifigure;
    t = uitree(fig,"Position",[20 20 150 150]);

    % Assign callback in response to node selection
    t.SelectionChangedFcn = @nodechange;

    % First level nodes
    category1 = uitreenode(t,"Text","Runners","NodeData",[]);
    category2 = uitreenode(t,"Text","Cyclists","NodeData",[]);

    % Second level nodes.
    % Node data is age (y), height (m), weight (kg)
    p1 = uitreenode(category1,"Text","Joe","NodeData",[40 1.67 58] );
    p2 = uitreenode(category1,"Text","Linda","NodeData",[49 1.83 90]);
    p3 = uitreenode(category2,"Text","Rajeev","NodeData",[25 1.47 53]);
    p4 = uitreenode(category2,"Text","Anne","NodeData",[88 1.92 100]);

    % Expand the tree
    expand(t);
    
    % Create the function for the SelectionChangedFcn callback
    % When the function is executed, it displays the data of the selected item
    function nodechange(src,event)
        node = event.SelectedNodes;
        display(node.NodeData);
    end
end

当用户运行 mytreeapp 并点击树中的节点时,MATLAB 将显示该节点的 NodeData

Tree UI component with parent nodes labeled "Runners" and "Cyclists". Each parent node has two child nodes with athlete names.

创建一个基于表中数据填充节点的树。

使用网格布局管理器创建一个图窗来容纳 UI 组件。加载电力公司停电的采样数据,并创建一个表 UI 组件来显示该数据。然后,创建一个树来容纳列出断电区域和原因的节点。

fig = uifigure;
gl = uigridlayout(fig,[1 2]);
gl.ColumnWidth = {'2x','1x'};

T = readtable("outages.csv");
T = T(1:20,["Region","OutageTime","Loss","Cause"]);
tbl = uitable(gl,"Data",T);

tr = uitree(gl);

指定要在树中显示的表变量。对于其中每一个变量,创建一个顶层节点,其文本就是变量名称。通过将变量的表条目转换为分类数组并将分类列表返回为 names,提取相关数据。然后,遍历各类别。对于每个元素,向树中适当的父节点下添加一个节点。

vars = ["Region","Cause"];

for k1 = 1:length(vars)
    var = vars{k1};
    varnode = uitreenode(tr,"Text",var);
    rows = T{:,var};
    names = categories(categorical(rows));
         
    for k2 = 1:length(names)
        text = names{k2};
        uitreenode(varnode,"Text",text);
    end
end

展开树以查看所有节点。

expand(tr)

Figure window with a table and a tree. The table contains outage sample data, and the tree contains a node for each region and cause in the table data.

为树组件创建一个上下文菜单。将该上下文菜单分配给树中的所有顶层节点。

在当前文件夹的新脚本中,创建一个 UI 图窗。然后,创建一个树,其中包含四个顶层节点和一组嵌套节点。

fig = uifigure;

t = uitree(fig,"Position",[20 200 175 100]);

category1 = uitreenode(t,"Text","Runners");
r1 = uitreenode(category1,"Text","Joe");
r2 = uitreenode(category1,"Text","Linda");

category2 = uitreenode(t,"Text","Cyclists");
c1 = uitreenode(category2,"Text","Rajeev");

category3 = uitreenode(t,"Text","Hikers");
h1 = uitreenode(category3,"Text","Jack");

category4 = uitreenode(t,"Text","Swimmers");
s1 = uitreenode(category4,"Text","Logan");

Tree with four collapsed top-level nodes

创建一个上下文菜单,其中包含一个菜单项和两个子菜单,用户可以点击该上下文菜单来展开单个树节点或所有树节点。对于每个子菜单,指定当用户选择菜单选项时要执行的 MenuSelectedFcn 回调函数。将相关的 App 对象作为输入传递给每个函数,以便从回调函数中访问 App 数据。

cm = uicontextmenu(fig);
m1 = uimenu(cm,"Text","Expand...");

sbm1 = uimenu(m1,"Text","This Node", ...
    "MenuSelectedFcn",{@expandSingle,fig});
sbm2 = uimenu(m1,"Text","All Nodes", ...
    "MenuSelectedFcn",{@expandAll,t});

通过将每个节点的 ContextMenu 属性设置为 ContextMenu 对象,将上下文菜单分配给顶层树节点。

category1.ContextMenu = cm;
category2.ContextMenu = cm;
category3.ContextMenu = cm;
category4.ContextMenu = cm;

在文件的底部,定义 expandSingleexpandAll 回调函数。定义函数来接受 MATLAB 传递给所有回调函数的源和事件数据。

定义 expandSingle 函数来同时接受包含树的 UI 图窗对象,并使用图窗的 CurrentObject 属性来确定点击哪个树节点来显示上下文菜单。然后,展开该节点。

定义 expandAll 函数来同时接受树对象,并展开树中的所有节点。

function expandSingle(src,event,f)
node = f.CurrentObject;
expand(node)
end

function expandAll(src,event,t)
expand(t)
end

保存并运行脚本。右键点击任一顶层树节点可查看上下文菜单。

A context menu associated with the "Cyclists" node. The "Expand" menu option is highlighted, and there is a submenu with options "This Node" and "All Nodes".

版本历史记录

在 R2017b 中推出

另请参阅

函数

工具