AIR窗口菜单工具类(增加助记键的支持)
发表于3年前(Dec 24, 2014 9:01:10 AM)  阅读 367  评论 0
分类: Flex
之前做扫雷游戏时,写过一个菜单工具类,参见扫雷(一):窗口菜单的制作 ,那个菜单工具类,可以支持多层级,支持快捷键,支持分隔符,但是不支持助记键,助记键是一般应用程序窗口菜单,使用ALT+F可以快速展开文件菜单项,这可以说是一个基本功能,AIR窗体也是支持的,所以我完善了一下菜单工具类,废话少说,直接贴源码。
package com.cangzhitao.flex.util
{
import flash.display.NativeMenu;
import flash.display.NativeMenuItem;
import flash.events.Event;
import flash.utils.Dictionary;
/**
* 修改菜单xml文件label命令错误,增加助记键ALT+
* update 2011-9-29
*
* 修改了包目录,对selectFunction属性值进行了判断,如果为空字符串,则不做监听
* update 2011-4-9
*
* 窗口菜单工具类,支持子菜单,支持定义快捷键,支持回调函数设置。
* 菜单xml内容格式如下。data属性暂未使用,keyEquivalent为快捷键,selectFunction为函数名,函数名为完全限定名,函数必须是public的
* private var menuXML:XML = <root>
<menu label="文件(F)" data="file" mnemonicIndex="3">
<item label="新建(N)" data="new" keyEquivalent="n" mnemonicIndex="3" selectFunction="" />
<item label="打开(O)" data="open" keyEquivalent="o" mnemonicIndex="3" selectFunction="" />
<item label="保存(S)" data="save" keyEquivalent="s" mnemonicIndex="3" selectFunction="" />
<item label="另存为(A)" data="save_as" keyEquivalent="S" mnemonicIndex="4" selectFunction="" />
<item lable="separator"/>
<item label="退出(X)" data="exit" keyEquivalent="x" mnemonicIndex="3" selectFunction="main.exitApp" />
</menu>
<menu label="帮助(H)" data="help" mnemonicIndex="3">
<item label="关于" data="about" keyEquivalent="h" selectFunction="" />
</menu>
</root>
* cangzhitao 2011-1-15
* www15119258@qq.com
* http://cangzhitao.com
*/
public class MenuUtil
{
public function MenuUtil()
{
}
//创建顶级菜单
public static function createRootMenu(menuXML:XML):NativeMenu {
var rootMenu:NativeMenu = new NativeMenu();
for each(var xml:XML in menuXML["menu"]) {
var temp:NativeMenuItem = new NativeMenuItem(xml.@label);
if(xml.hasOwnProperty("@mnemonicIndex")) {
temp.mnemonicIndex = xml.@mnemonicIndex;
}
rootMenu.addItem(temp);
temp.submenu = createMenu(xml);
}
return rootMenu;
}
public static var classes:Dictionary = new Dictionary();;
//创建子菜单
private static function createMenu(menuXML:XML):NativeMenu {
var subMenu:NativeMenu = new NativeMenu();
for each(var xml:XML in menuXML["item"]) {
var temp:NativeMenuItem;
if(xml.@lable=="separator") {
temp = subMenu.addItem(new NativeMenuItem("", true));
} else {
temp = subMenu.addItem(new NativeMenuItem(xml.@label));
}
//添加快捷键
if(xml.hasOwnProperty("@keyEquivalent")) {
temp.keyEquivalent = xml.@keyEquivalent;
}
if(xml.hasOwnProperty("@mnemonicIndex")) {
temp.mnemonicIndex = xml.@mnemonicIndex;
}
if(xml.hasOwnProperty("@data")) {
temp.data = xml.@data;
}
//添加回调函数
if(xml.hasOwnProperty("@selectFunction")&&xml.@selectFunction!="") {
var functionArray:Array = String(xml.@selectFunction).split(".");
// var objectClass:Class = getDefinitionByName(functionArray[0]) as Class;
// var object:Object = new objectClass();
//必须把所调函数所在的类添加进classes字典里
var object:Object = classes[functionArray[0]];
temp.addEventListener(Event.SELECT, object[functionArray[1]]);
}
//迭代添加子菜单
if(XMLList(xml["item"]).length()>0) {
temp.submenu = createMenu(xml);
}
}
return subMenu;
}
}
}
在应用窗口初始化时添加下面代码建立菜单
//添加菜单回调函数里面的源对象
MenuUtil.classes[“main”] = this;
//建立菜单项
nativeWindow.menu = MenuUtil.createRootMenu(menuXML);
其中main为窗口的名称,包括窗口所在文件夹路径, 如窗口路径为src/com/cangzhitao/main.mxml,这里mian就必须替换成com.cangzhitao.main,menuXML为菜单xml文件,可以参考工具类里面的示例。
运行界面如图: