870920 Menu

JUCE类库附带示例的源码分析·7

 ResourceEditorPanel类是研究和使用表格、自定义组件作为单元格的优秀示例(ui目录下)。

1

图 5 87 使用自定义组件作为单元格的表格模块类图

 异常重要的一点:Component组件类本身就是一个数据容器(组件容器),该类持有一个数组对象:Array <Component*> childComponentList; 正是该对象用于存储本组件所容纳的所有子组件(指针)。Component类的addChildComponent()添加子组件,addAndMakeVisible()添加并显示子组件,removeChildComponent()移除子组件,deleteAllChildren()移除并销毁所有子组件、getChildComponent()基于给出的索引获取某个子组件等函数,其内部实现均是由childComponentList数组对象来担纲(添加移除元素)。因此,针对本组件内的所有子组件的操作,往往使用下列遍历语句:
for (int i = getNumChildComponents(); –i >= 0;)
{
MyComp* const child = dynamic_cast <MyComp*> (getChildComponent(i));
if (child != nullptr)
child->doSomething();
}
 组件的paint()函数不仅仅用来绘制自身,还可以在此函数中绘制子组件或其他组件。原因是:Graphics&对象可在此根据本组件的有关情况获取要绘制的大小或其他设置。这么做的前提是:子组件或其他组件类中写一个A函数,A函数的参数为Graphics&,在本组件的paint()函数中,子组件或其他组件类的对象调用它的A函数,将本组件的g作为参数传过去即可。
 resized()函数中,对子组件的布局定位,可使用“边距定位”函数setBoundsInset():
// reloadButton按钮布局定位,该按钮的四个边界距离本组件的4个边界均为2像素
reloadButton->setBoundsInset (BorderSize<int> (2));

 实现程序属性设置的功能性(模块)类图与核心语句:

2

图 5 88 实现程序属性设置的功能性类图与核心语句