870920 Menu

JUCE复合控件之TreeView详解

TreeView采用树的形式显示有关数据,特别是具有父节点和子节点性质的数据。因此,可称之为“树形视图”。实现树形视图依然需要经典的“模型-视图”模式,关键思路有二:

1. 自定义树形视图中所显示的节点类,继承自TreeViewItem抽象基类,实现其纯虚函数并重写几个核心函数。节点可包含子节点,在该类的itemOpennessChanged()函数中循环法调用addSubItem()函数来添加即可。如果采用XML技术,addSubItem()可直接添加本类的对象。所有节点均为TreeView中的一个项目,并且自动分层布局。

TreeViewItem类的成员函数不少,比如:绘制节点,收缩展开某个父节点,添加、移除、选择,不选某个节点,返回所选的子节点,返回某个子节点的父节点,返回某个节点在TreeView中的索引,返回本节点所隶属的TreeView,判断某个父节点是否已展开,判断是否选择了某个节点,设置本节点的宽度和高度,鼠标单击或双击时自动调用本类的一些函数,允许拖拽本节点等等。

2. 内容组件中声明、使用并管理TreeView对象。该对象类负责显示并控制自定义的TreeViewItem节点,是否可多选,返回当前所选的某个节点等等。注意:一个树形视图必须且只能有一个根节点,该根节点可包含一到多个子节点,每个子节点又可以有多个子节点。TreeView所设置并显示的根节点即为自定义的TreeViewItem对象。

TreeView有一个重要的派生类:FileTreeComponent目录树。该树可列举当前目录下的所有文件和子目录,每个目录皆相当于TreeView中的一个节点,分层显示。要使用目录树,需两个核心类和一个辅助类:

  • FileTreeComponent文件树组件,TreeView的派生类,可显示某目录下的所有文件和子目录。FileTreeComponent的构造参数为DirectoryContentsList目录内容列表类的引用型对象。
  • DirectoryContentList目录内容列表,继承自TimeSliceClient。DirectoryContentList类的构造2参需一个TimeSliceThread类的引用型对象。
  • TimeSliceThread时间片线程类。构造DirectoryContentList对象时所需。

流程有三

  1. 内容组件类中声明一个TimeSliceThread栈对象
  2. 内容组件类中声明FileTreeComponent和DirectoryContentList这两个类的指针
  3. 内容组件类的构造函数中创建以上两个类的对象,后一个对象设置当前所显示的根目录,启动时间片线程。内容组件类的resized()中对FileTreeComponent对象布局定位。析构函数中清理善后。内容组件类的功能性函数中,FileTreeComponent对象调用该类的有关函数完成具体功能。比如:getSelectedFile()函数可返回当前所选的文件,setDragAndDropDescription()允许拖放树中的文件和目录,refresh()更新树中的文件和目录,等等。

关键代码示例(位于内容组件类的构造函数中):