`
lixinye0123
  • 浏览: 323426 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

10.8 创建本地菜单

阅读更多

创建本地菜单

要创建一个菜单,先构造一个NativeMenu对象作为根菜单:

var root:NativeMenu = new NativeMenu(); 

作为窗体或应用程序的根菜单,所有的菜单项必须为子菜单(上下文菜单的根菜单可包含所有三种类型的菜单项),AIR提供了两种方法创建子菜单。你可以通过菜单的addSubmenu()方法添加菜单项:

var editMenu:NativeMenuItem = root.addSubmenu(new NativeMenu(), "Edit"); 

你也可以创建菜单项然后再赋值给子菜单:

var editMenu:NativeMenuItem = root.addItem("Edit"); 

editMenu.submenu = new NativeMenu(); 

菜单创建好后,再赋值给应用程序,窗体或上下文菜单:

设置应用程序菜单:

Shell.shell.menu = root; 

设置窗体菜单:

nativeWindowObject.menu = root; 

设置上下文菜单:

interactiveObject.contextMenu = root; 

设置dock icon菜单

DockIcon(Shell.shell.icon).menu = root; 

设置系统托盘菜单

SystemTrayIcon(Shell.shell.icon).menu = root; 

定义菜单项,子菜单和分隔符

 一个菜单项可以是一个命令项,一个子菜单或一个分隔符。一个菜单项如果设置构造函数的isSeparator参数为true这变成一个分隔符。一个菜单项如果赋值给NativeMenu对象的submenu属性则变成一个子菜单(或使用addSubmenu() 方法),否则菜单项就是一个命令项,只有命令项可以发出select事件。

菜单中的菜单项顺序就是其加入的先后顺序,除非你自己修改了其索引值,如通过addItemAt()方法在指定位置加入菜单项。

创建一个命令项:

var copy:NativeMenuItem = new NativeMenuItem("Copy",false); 

copy.addEventListener(Event.SELECT,onCopyCommand); 

editMenu.addItem(copy); 

创建一个子菜单

var editMenu:NativeMenuItem = new NativeMenuItem("Edit", false); 

editMenu.submenu = new NativeMenu(); 

也可以使用菜单的addSubmenu()方法添加菜单项:

var editMenu:NativeMenuItem = root.addSubmenu(new NativeMenu(), "Edit"); 

创建一个分隔符:

var separatorA:NativeMenuItem = new NativeMenuItem("A", true); 

editMenu.addItem(separatorA); 

创建一个上下文菜单

 在AIR,ContextMenu API 类继承自NativeMenu类。ContextMenu提供了一个事件属性,ContextMenuEvent.mouseTarget,其确定打开该菜单的对象。

上下文菜单(Context menus)可赋值给任何继承自InteractiveObject 类的Flash对象。通过设置对象的contextMenu属性进行赋值。

上下文菜单仍可以包含命令项及分隔符,在AIR上下文菜单中没有默认的菜单项。

下面的例子创建了一个简单的edit 菜单:

var editContextMenu:ContextMenu = new ContextMenu(); 

var item:NativeMenuItem; 

item = editContextMenu.addItem(new ContextMenuItem("Cut")); 

item.name="Cut"; 

editContextMenu.addItem(new ContextMenuItem("Copy")); 

item.name="Copy"; 

editContextMenu.addItem(new ContextMenuItem("Paste")); 

item.name="Paste"; 

editContextMenu.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(event:ContextMenuEvent):void{ 

        var command:NativeMenuItem = event.target as NativeMenuItem; 

        switch (command.name){ 

            case "Cut" : 

                doCutCommand(event.mouseTarget); 

                break; 

            case "Copy" : 

                doCopyCommand(event.mouseTarget); 

                break; 

            case "Paste" : 

                doPasteCommand(event.mouseTarget); 

                break; 

        } 

    }); 

this.contextMenu = editContextMenu; //Where "this" is an InteractiveObject 

显示弹出式菜单

通过调用菜单的display()方法可以随时在窗体的任意位置显示弹出式菜单。

下面的方法显示一个定义弹出式对象的菜单:

private function onMouseClick(event:MouseEvent):void{ 

    popupMenu.display(event.target.stage, event.stageX, event.stageY); 

注意:实际上没有必要在事件处理函数中显示菜单,任何方法都可以调用display()方法。

处理菜单事件

当一个菜单项被点击时,事件就会被触发,AIR程序会对此作出反应。

下面的代码输出被激活的菜单名称:

var submenu:NativeMenu = new NativeMenu();

var red:NativeMenuItem = new NativeMenuItem("Red");

red.addEventListener(Event.SELECT,announceSelection)

var green:NativeMenuItem = new NativeMenuItem("Green");

green.addEventListener(Event.SELECT,announceSelection)

var blue:NativeMenuItem = new NativeMenuItem("Blue");

blue.addEventListener(Event.SELECT,announceSelection)

var menuItem:NativeMenuItem = new NativeMenuItem("Change Color");

submenu.addItem(red);

submenu.addItem(green);

submenu.addItem(blue);

menuItem.submenu = submenu;

Shell.shell.menu.addItem(menuItem);     

function announceSelection(e:Event):void {

    var menuItem:NativeMenuItem = e.target as NativeMenuItem;

    trace(menuItem.label + " has been selected")

声明式定义菜单

输入菜单和菜单项的属性是一件很枯燥的事情,不过菜单是一个有规律的层级结构,可以使用XML格式定义直接写在函数里。

下面的类继承自NativeMenu,在构造函数里传入XML对象,像这样:

package 

...

    
import flash.display.NativeMenu; 

    
import flash.display.NativeMenuItem; 

    
import flash.events.Event; 

 

    
public class DeclarativeMenu extends NativeMenu 

    
...

        
public function DeclarativeMenu(XMLMenuDefinition:XML):void...

            
super(); 

            addChildrenToMenu(
this, XMLMenuDefinition.children()); 

        }
 

         

        
private function addChildrenToMenu(menu:NativeMenu, 

                                children:XMLList):NativeMenuItem
...

            var menuItem:NativeMenuItem; 

            var submenu:NativeMenu; 

             

            
for each (var child:XML in children)...

                
if(String(child.@label).length > 0)...

                    menuItem 
= new NativeMenuItem(child.@label); 

                    menuItem.name 
= child.name(); 

                }
 else ...

                    menuItem 
= new NativeMenuItem(child.name()); 

                    menuItem.name 
= child.name(); 

                }
 

                menu.addItem(menuItem); 

                
if(child.children().length() > 0)...

                    menuItem.submenu 
= new NativeMenu(); 

                    addChildrenToMenu(menuItem.submenu,child.children()); 

                }
 

            }
 

            
return menuItem; 

        }
 

    }
//End class 

}
//End package 

要使用这个类创建菜单,只需要传入一个XML格式的菜单定义即可:

var menuDefinition:String =  

        "<root>" +  

             "<FileMenu label='File'>" +  

                "<NewMenu label='New'>" + 

                    "<NewTextFile label='Text file'/>" + 

                    "<NewFolder label='Folder'/>" + 

                    "<NewProject label='Project'/>" + 

                "</NewMenu>" + 

                "<OpenCommand label='Open'/>" + 

                "<SaveCommand label='Save'/>" + 

            "</FileMenu>" + 

            "<EditMenu label='Edit'/>" +  

                "<CutCommand label='Cut'/>" +  

                "<CopyCommand label='Copy'/>" + 

                "<PasteCommand label='Paste'/>" +  

            "<EditMenu/>" + 

            "<FoodItems label='Food Items'>" + 

                "<Jellyfish/>" +  

                "<Tripe/>" +  

                "<Gizzard/>" +  

            "</FoodItems>" + 

    "</root>"; 

var test:DeclarativeMenu = new DeclarativeMenu(new XML(menuDefinition)); 

要监听菜单事件,你可以直接监听根菜单即可,通过event.target.name属性判定哪个命令项被触发,你也可以根据菜单名称搜索菜单项并添加独立的事件监听器。

例子:窗体和应用程序菜单

margin-bottom: 5pt; margin-top:

分享到:
评论

相关推荐

    Android高级编程.pdf

    4.5 创建和使用菜单 4.5.1 Android菜单系统简介 4.5.2 定义活动的菜单 4.5.3 动态更新菜单项 4.5.4 处理菜单选择 4.5.5 子菜单和上下文菜单 4.5.6 To-Do List示例续 4.6 小结 第5章 Intent、广播接收器、 Adapter和...

    《Android高级编程》

    4.5 创建和使用菜单 4.5.1 Android菜单系统简介 4.5.2 定义活动的菜单 4.5.3 动态更新菜单项 4.5.4 处理菜单选择 4.5.5 子菜单和上下文菜单 4.5.6 To-Do List示例续 4.6 小结 第5章 Intent、广播接收器、 Adapter和...

    中文LOTUS NOTES R5 24学时学习教程

    10.8 创建和使用群组 118 10.9 学时小结 120 10.10 专家答疑 120 第11学时 漫游Internet 121 11.1 设置浏览惯用选项 121 11.1.1 按直接检索进行设置 122 11.1.2 为使用InterNotes服务器进行设置 123 11.2 自定义欢迎...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·指导读者用c++和c++/cli设计和创建大量的windows应用程序  ·为帮助读者掌握编程技巧,提供了大量可运行的示例和练习 作译者  Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,...

    Android高级编程--源代码

    4.5 创建和使用菜单 98 4.5.1 Android菜单系统简介 98 4.5.2 定义活动的菜单 100 4.5.3 动态更新菜单项 102 4.5.4 处理菜单选择 103 4.5.5 子菜单和上下文菜单 103 4.5.6 To-Do List示例续 105 4.6 小结 111...

    Android基础教程

    3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 3.10.1 利用日志消息调试程序 3.10.2 利用调试器调试程序 3.11 退出游戏 3.12 快速阅读指南 第4章 绘制2D图形 4.1 Android图形基础 4.1.1 Color类 4.1.2 ...

    疯狂Android讲义源码

     2.7.3 创建复选菜单项和单选菜单项 137  2.7.4 设置与菜单项关联的Activity 140  2.7.5 上下文菜单 141  2.8 本章小结 143  第3章 事件处理 144  3.1 Android的事件处理 145  3.2 基于监听的事件处理 145  ...

    疯狂Android讲义.part2

    2.7.3 创建复选菜单项和单选菜单项 137 2.7.4 设置与菜单项关联的Activity 140 2.7.5 上下文菜单 141 2.8 本章小结 143 第3章 事件处理 144 3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的...

    疯狂Android讲义.part1

    2.7.3 创建复选菜单项和单选菜单项 137 2.7.4 设置与菜单项关联的Activity 140 2.7.5 上下文菜单 141 2.8 本章小结 143 第3章 事件处理 144 3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的...

    Visual C++ 2005入门经典--源代码及课后练习答案

    10.8 小结 575 第11章 Windows编程的概念 576 11.1 Windows编程基础 576 11.1.1 窗口的元素 577 11.1.2 Windows程序与操作系统 579 11.1.3 事件驱动型程序 579 11.1.4 Windows消息 579 11.1.5 ...

    Access+2000中文版高级编程

    10.8.1 检查选项组菜单窗体的组成 297 10.8.2 ManipulatingControlsExample窗体 298 10.8.3 查看窗体后面的代码 299 10.9 小 结 304 第11章 创建强大的报表 305 11.1 对汇总、细节以及综合这二者的报表...

    Access 2000中文版高级编程(part1)

    10.8.1 检查选项组菜单窗体的组成 297 10.8.2 ManipulatingControlsExample窗体 298 10.8.3 查看窗体后面的代码 299 10.9 小 结 304 第11章 创建强大的报表 305 11.1 对汇总、细节以及综合这二者的报表建立同一...

    Eclipse_Swt_Jface_核心应用_部分19

    第1章 Java语言的GUI历史 2 1.1 最初的AWT 2 1.2 Swing工具包 3 1.3 Eclipse的诞生 3 1.4 Eclipse贡献SWT工具包 5 1.4.1 SWT的结构 6 ...15.3.3 创建菜单项 297 15.3.4 菜单项的事件处理 298 ...

    iPhone开发秘籍

    10.8 秘诀:构建一个简单的基于web的服务器 268 10.9 即时消息传送 272 10.10 小结 272 第11章 cover flow编程 274 11.1 uicoverflowlayer类 274 11.2 构建cover flow视图 276 11.3 构建cover flow视图控制器...

    《程序天下:JavaScript实例自学手册》光盘源码

    10.8 调用复选框后面的文字 10.9 两个checkbox互斥问题 10.10 使用checkbox控制文本框 10.11 选中表格行前的复选框则行变色 10.12 用JavaScript生成面包屑导航 10.13 复选框的反选 10.14 选中所有复选框 10.15 复选...

Global site tag (gtag.js) - Google Analytics