U子注
考虑到这里的原文翻译出来可能会看起来有些迷,刚接触的人有可能看不明白是怎么回事,于是在这里对吉里吉里中的“菜单栏”和“菜单项”的原理作一些详细的说明。
这个MenuItem类是专门用于对菜单项进行管理的,可以进行诸如添加、删除、改名之类的操作,这一点是没问题的。
但是,菜单项目终究还是需要显示出来的,而其中比较常见的一种情况就是:让它显示在窗口的菜单栏上。
这时候就需要跟Window类进行交互,而接口就是 Window.menu 这个属性。
Window.menu 是一个只读属性,它的本质其实是一个数组,用system.inform()方法输出它的话,会得到一个object。
就结论来讲,这个数组里面存的元素其实就是MenuItem类的对象。
暂且抛开KAG系统,当我们单纯想要在一个裸窗口中创建一个菜单栏的话,可以像下面这样写。
var a = new Window(); a.visible = true; //首先,创建一个裸窗口
a.menu.add(new MenuItem(a,"菜单项的名称")); //然后在这个窗口上添加菜单项
这样就可以在窗口中创建出一个只有一个菜单项的菜单栏了。
这里要注意一下,这个“a.menu.add()”的add()方法,并不是指MenuItem类的add()方法。
因为这里的 a.menu 是Window类的一个对象,之前也说过,它本身是个数组,所以这里的add()是tjs2的Array类所属的方法,用来添加数组元素。
由此可见,在将MenuItem类的实例添加到 Window.menu 这个数组下之后,菜单项就会在窗口的菜单栏位置显示出来,这也就印证了刚刚提到的结论。
但是,仔细观察我们会发现,这样创建出来的菜单项就只能保持这样,没法进行管理(比如添加子菜单啦、修改各种参数啦之类的)。
这时,为了让这个菜单项变成真正有意义的、可管理的部件,我们可以这样写:
a.menu.add(a.ItemButton1 = new MenuItem(a, "菜单按钮1"));
这样就相当于把新建出来的MenuItem的对象赋给了一个变量,这样就可以进行管理了。
经测试,这个变量是不需要用var去定义的,可以直接像这样写出来就可以用,其原理在这里不多赘述,总之可用。
然后,我们如果想要添加子菜单项的话就可以这样写:
a.ItemButton1.add(a.subItemButton1 = new MenuItem(a, "子菜单按钮1"));
这里的add()方法就是MenuItem类的add()方法了,用来添加下拉菜单上的子菜单项。
嗯,关于菜单项的原理就讲到这里,大家可以参考一下KAG系统中的Menu.tjs文件。
在这里姑且提一下,KAG的Menu.tjs里的写法是不太一样的。
像上面的例子中的“a.menu.add()”和“a.ItemButton1.add()”,在Menu.tjs里是省略了前面的“a”的。
由于那里面的函数是在kag的闭包下运行的,这样里面的变量就都属于kag下的变量,于是就省略了kag,或者用“this”来代指。
这个地方对于新手来说的确有些迷,如果对于tjs中的“闭包”和“Array类(数组)”的概念还不太明白的话,可以再去参考一下tjs2参考手册中的解释。
关于“闭包”的解释是在“类(class)”页面下,关于数组的解释是在“Array 类”页面下。