父对象和子对象

 
 
 

将看到用于指 UI 元素和 ELF 命令的术语“父对象”和“子对象”。在该上下文中,父对象只是一个包含其他 UI 元素的 UI 元素,而子对象是包含在父对象中的元素。一个父对象的子对象也可以是其他子对象的父对象。

窗口是层次的最顶层父对象。层次中的其他元素可以是布局、控件、菜单、菜单项等。层次可以是任意深的,因为布局可以包含其他布局,菜单项可以包含子菜单。

默认父对象

为简化窗口的创建并减少脚本 ELF 命令中的混乱,请了解默认父对象的概念。这意味着不必为每个创建的元素显式指定父对象。创建一个窗口后,该窗口将成为所有后续菜单或控件的默认父对象。新的 UI 元素将一直显示在该窗口内部,直到显式更改了默认父对象(使用 setParent 命令)或创建了另一个窗口为止。

布局和菜单有不同的默认父对象。窗口是控件的初始默认父对象,并且如果该窗口是使用菜单栏创建的,那么它也是菜单的初始默认父对象。创建一个布局后,该布局将成为布局和控件的新默认父对象。创建一个菜单栏布局后,该菜单栏布局将成为菜单的新默认父对象。创建一个菜单后,该菜单将成为菜单项的默认父对象。

默认父对象可以通过创建新父对象隐式进行更改,或者可以通过使用“setParent”命令显式进行更改。若要更改菜单的默认父对象,请使用“-m/menu”标志。将父对象设置为窗口或菜单栏布局,将为菜单和布局设定默认父对象。以下是一个小代码示例,说明为布局使用默认父对象。

脚本 1. 默认父对象布局的示例

window ExampleWindow1;
 columnLayout;
 button -label "Button 1";
 button -label "Button 2";
 rowColumnLayout -numberOfColumns 2;
 text -label "Name:";
 textField;
 text -label "City:";
 textField;
 setParent ..;
 checkBox -label "Lights ";
 checkBox -label "Camera ";
 checkBox -label "Action ";
showWindow ExampleWindow1;

“文本”元素和“文本字段”元素是行列布局的子对象。按照行列布局,它们排列在两列中。如果未使用“setParent ..”命令,那么默认父对象将继续是行列布局,且复选框也会在两个列中进行布局。为了进行演示,以下示例与上一个示例相同,除了已将“setParent”命令注释掉之外。

脚本 2. setParent 命令对默认父对象布局产生的影响

window ExampleWindow2;
 columnLayout;
 button -label "Button 1";
 button -label "Button 2";
 rowColumnLayout -numberOfColumns 2;
 text -label "Name:";
 textField;
 text -label "City:";
 textField;
 //setParent ..;
 checkBox -label "Lights ";
 checkBox -label "Camera ";
 checkBox -label "Action ";
showWindow ExampleWindow2;

“setParent”命令接受“-up”和“-top”标志以分别将层次向上移动一个级别,或移动到层次的顶层。类似地,还可以显式指定一个新默认父对象,例如“setParent <windowOrLayoutName>;”。也可以使用“setParent”命令查询当前父对象;例如,“setParent -query”。

以下是一个简短示例,说明为菜单使用默认父对象。

脚本 3. 默认父对象菜单示例

window -menuBar true ExampleWindow3;
 menu -label "File" TestFileMenu;
 menuItem -label "Open" menuItem1;
 menuItem -label "Close" menuItem2;
 menuItem -label "Quit" menuItem3;
 menu -label "Edit" TestEditMenu;
 menuItem -label "Cut" menuItem1;
 menuItem -label "Copy" menuItem2;
 menuItem -label "Paste" menuItem3;
 menu -label "Options" TestOptionsMenu;
 menuItem -label "Color" -subMenu true menuItem1;
 menuItem -label "Red";
 menuItem -label "Green";
 menuItem -label "Blue";
 setParent -menu ..;
 menuItem -label "Size" -subMenu true menuItem2;
 menuItem -label "Small";
 menuItem -label "Medium";
 menuItem -label "Large";
 setParent -menu ..;
showWindow ExampleWindow3;

创建 UI 元素的所有命令也接受“-p/parent parentName”标志以显式指定该元素的父对象。该标志将始终优先于默认父对象。

会以不同的方式处理集合。它们使用当前布局作为默认父对象,并且它们也接受“-p/parent”标志以为其显式设置父对象。但是,集合还能够跨窗口,且有一个用于选择该行为的“-g/global”标志。使用“-g/global”标志时,集合将没有父对象。为集合设置父对象仅仅是为了方便其删除。如果删除了该父对象,也将删除该集合。全局集合必须显式删除。