主程序mxml:

  1 <?xml version="1.0" encoding="utf-8"?>
  2
  3 <!--功能描述:结合tree拓展右键功能 必须在index.template.html设置params.wmode = "opaque"以屏蔽flash右键;-->
  4
  5 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
  6                xmlns:s="library://ns.adobe.com/flex/spark"
  7                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
  8                initialize="init()">
  9     <fx:Script>
 10         <![CDATA[
 11             import com.render.TreeRightClickManager;
 12
 13             import mx.controls.Alert;
 14             import mx.controls.Menu;
 15             import mx.controls.listClasses.IListItemRenderer;
 16             import mx.events.MenuEvent;
 17
 18             [Event(name="rightClick",type="flash.events.ContextMenuEvent")]
 19
 20             private var rightClickRegisted:Boolean = false;
 21             private var menu:Menu;
 22             [Bindable]
 23             private var data:XML;
 24
 25             private function init():void{
 26                 data=
 27                     <actor label="周星驰" level="0">
 28                         <year label="1988" level="1">
 29                             <item label="《霹雳先锋》香港票房8916612 " level="2"/>
 30                             <item label="《捕风汉子》香港票房3149395" level="2"/>
 31                              <item label="《最佳女婿》香港票房5807710" level="2"/>
 32                         </year>
 33                     </actor>;
 34                 if (!rightClickRegisted){
 35                     TreeRightClickManager.regist();
 36                     rightClickRegisted = true;
 37                 }
 38                 //加载右击事件
 39                 tree.addEventListener(TreeRightClickManager.RIGHT_CLICK,treeRightClickHandler);
 40             }
 41
 42             /**
 43              *树右击事件
 44              **/
 45             private function treeRightClickHandler(event:ContextMenuEvent):void
 46             {
 47                 tree_onRightClicked(event);
 48                 tree_removeMenu();
 49                 tree_InitMenu();
 50             }
 51
 52
 53             private function tree_onRightClicked(e:ContextMenuEvent):void
 54             {
 55                 var rightClickItemRender:IListItemRenderer;
 56                 var rightClickIndex:int;
 57                 if(e.mouseTarget is IListItemRenderer)
 58                 {
 59                     rightClickItemRender = IListItemRenderer(e.mouseTarget);         }
 60
 61                 else if(e.mouseTarget.parent is IListItemRenderer)
 62                 {
 63                     rightClickItemRender = IListItemRenderer(e.mouseTarget.parent);
 64                 }
 65                 if(rightClickItemRender != null)
 66                 {
 67                     rightClickIndex = tree.itemRendererToIndex(rightClickItemRender);
 68                     if(tree.selectedIndex != rightClickIndex)
 69                     {
 70                         tree.selectedIndex = rightClickIndex;
 71                     }
 72                 }
 73             }
 74
 75             /**
 76              * 删除右键菜单
 77              **/
 78             private function tree_removeMenu():void
 79             {
 80                 if(menu!=null)
 81                 {
 82                     menu.hide();
 83                     menu.removeEventListener(MenuEvent.ITEM_CLICK,tree_MenuItemSelected);
 84                     menu=null;
 85                 }
 86             }
 87
 88             /**
 89              * 生成右键菜单
 90              **/
 91             private var selectedId:String="";
 92             private var selectedLabel:String="";
 93             private function tree_InitMenu():void
 94             {
 95                 var currentItem:XML=tree.selectedItem as XML;
 96                 selectedId=currentItem.@id;
 97                 selectedLabel=currentItem.@label;
 98                 var level:String=currentItem.@level;
 99
100                 menu = Menu.createMenu(this, tree_createMenuItems(level), false);
101                 menu.iconField="itemIcon";//右键菜单的图标
102                 menu.labelField="label";  //右键菜单的名称
103                 menu.variableRowHeight = true;
104                 menu.addEventListener(MenuEvent.ITEM_CLICK, tree_MenuItemSelected);  //右键菜单的事件
105                 var point:Point = new Point(mouseX,mouseY);
106                 point = localToGlobal(point);
107                 menu.show(point.x,point.y);  //显示右键菜单
108             }
109
110
111             /**
112              * 根据节点不同,生成不同的菜单
113              **/
114             private function tree_createMenuItems(level:String):Array
115
116             {
117                 var menuItems:Array = new Array();
118                 var menuXs:Object= new Object;
119                 menuXs.label = '刷新';
120                 //menuXs.itemIcon = this.menu_TZ_add;  //给菜单加图标
121                 menuItems.push(menuXs);
122                 var menuExpand:Object=new Object();
123                 menuExpand.label="展开当前节点";
124                 menuItems.push(menuExpand);
125                 var menuClose:Object=new Object();
126                 menuClose.label="关闭当前节点";
127                 menuItems.push(menuClose);
128                 var menuExpandAll:Object=new Object();
129                 menuExpandAll.label="展开所有节点";
130                 menuItems.push(menuExpandAll);
131                 var menuCloseAll:Object=new Object();
132                 menuCloseAll.label="关闭所有节点";
133                 menuItems.push(menuCloseAll);
134                 switch(level){
135                     case "0":
136                         var menuAddNj:Object = new Object;
137                         menuAddNj.label = "添加明星";
138                         menuItems.push(menuAddNj);
139                         var menuDelNj:Object=new Object();
140                         menuDelNj.label="删除明星";
141                         menuItems.push(menuDelNj);
142                         break;
143                     case "1":
144                         var menuAddBj:Object=new Object();
145                         menuAddBj.label="添加年份";
146                         menuItems.push(menuAddBj);
147                         var menuDelBj:Object=new Object();
148                         menuDelBj.label="删除年份";
149                         menuItems.push(menuDelBj);
150                         var menuAddStu:Object=new Object();
151                         menuAddStu.label="添加影片";
152                         menuItems.push(menuAddStu);
153                         break;
154                     case "2":
155                         var menuEditStu:Object=new Object();
156                         menuEditStu.label="修改影片";
157                         menuItems.push(menuEditStu);
158                         var menuDelStu:Object=new Object();
159                         menuDelStu.label="删除影片";
160                         menuItems.push(menuDelStu);
161                         break;
162                 }
163
164                 return menuItems;
165
166             }
167             /**
168              * 点击菜单,相应方法
169              **/
170             private function tree_MenuItemSelected(event:MenuEvent):void
171
172             {
173                 var menuItem:Object = event.menu.selectedItem as Object;
174                 switch(menuItem.label)
175                 {
176                     case "展开当前节点":
177                         nodeExpand();
178                         break;
179                     case "关闭当前节点":
180                         nodeClose();
181                         break;
182                     case "展开所有节点":
183                         nodeExpandAll();
184                         break;
185                     case "关闭所有节点":
186                         nodeCloseAll();
187                         break;
188                     case "删除影片":
189                         delStuNode();
190                         break;
191                     case "添加影片":
192                         addStuNode();
193                         break;
194
195                 }
196             }
197
198
199             private function treeChanged(event:Event):void{
200                 var selectedTreeNode:XML;
201                 selectedTreeNode=Tree(event.target).selectedItem as XML;
202                 //Alert.show("您点击了:"+selectedTreeNode.@label,"提示");
203
204             }
205
206             /**
207              * 展开当前节点
208              **/
209             private function nodeExpand():void{
210                 tree.expandItem(tree.selectedItem,true);
211             }
212
213             /**
214              * 关闭当前节点
215              **/
216             private function nodeClose():void{
217                 tree.expandItem(tree.selectedItem,false);
218
219             }
220
221             /**
222              * 展开所有节点
223              **/
224             private function nodeExpandAll():void{
225                 for each(var item:XML in tree.dataProvider) {
226                     tree.expandChildrenOf(item,true);
227                 }
228             }
229
230             /**
231              * 关闭所有节点
232              **/
233             private function nodeCloseAll():void{
234                 //方法1:studentTree.openItems = [];
235                 //方法2:
236                 for each(var item:XML in tree.dataProvider) {
237                     tree.expandChildrenOf(item,false);
238                 }
239             }
240
241             /**
242              * 删除节点
243              **/
244             private function delStuNode():void{
245                 Alert.show("删除影片 ID="+selectedId+"  名称="+selectedLabel,"提示",4,null,ok);
246                 function ok():void
247                 {
248                     var delStuItemPar:Object=new Object();
249                     delStuItemPar=tree.selectedItem.parent();
250                     var delStuInx:int=tree.selectedItem.childIndex();
251                     tree.dataDescriptor.removeChildAt(delStuItemPar,tree.selectedItem,delStuInx,tree.dataProvider);
252                 }
253
254             }
255
256             /**
257              * 添加影片
258              **/
259             private function addStuNode():void{
260                 var node:XML=<item label="新影片" level="2"/>;
261                 (tree.selectedItem as XML).appendChild(node);
262             }
263
264         ]]>
265     </fx:Script>
266     <fx:Declarations>
267         <!-- 将非可视元素(例如服务、值对象)放在此处 -->
268     </fx:Declarations>
269     <s:Panel x="25" y="23" width="250" height="448" title="喜剧之王">
270         <mx:Tree id="tree" left="0" top="0" width="100%" height="100%" labelField="@label" change="treeChanged(event)" dataProvider="{data}" allowMultipleSelection ="true"/>
271     </s:Panel>
272 </s:Application>

View Code

com.render.TreeRightClickManager类:

  1 package com.render
  2 {
  3     import flash.display.InteractiveObject;
  4     import flash.events.ContextMenuEvent;
  5     import flash.events.MouseEvent;
  6     import flash.external.ExternalInterface;
  7
  8     import mx.core.Application;
  9     import mx.core.FlexGlobals;
 10
 11     public class TreeRightClickManager
 12     {
 13         static private var rightClickTarget:*;
 14         static public const RIGHT_CLICK:String = "rightClick";
 15         static private const javascript:XML =
 16             <script>
 17                 <![CDATA[
 18                     function(flashObjectId)
 19                     {
 20                         var RightClick = {
 21                                 init: function (flashObjectId) {
 22                                 this.FlashObjectID = flashObjectId;
 23                                 this.Cache = this.FlashObjectID;
 24                                 if(window.addEventListener){
 25                                      window.addEventListener("mousedown", this.onGeckoMouse(), true);
 26                                 } else {
 27                                     document.getElementById(this.FlashObjectID).parentNode.onmouseup = function() { document.getElementById(RightClick.FlashObjectID).parentNode.releaseCapture(); }
 28                                     document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }}
 29                                     document.getElementById(this.FlashObjectID).parentNode.onmousedown = RightClick.onIEMouse;
 30                                 }
 31                             },
 32                             /**
 33                              * GECKO / WEBKIT event overkill
 34                              * @param {Object} eventObject
 35                              */
 36                             killEvents: function(eventObject) {
 37                                 if(eventObject) {
 38                                     if (eventObject.stopPropagation) eventObject.stopPropagation();
 39                                     if (eventObject.preventDefault) eventObject.preventDefault();
 40                                     if (eventObject.preventCapture) eventObject.preventCapture();
 41                                        if (eventObject.preventBubble) eventObject.preventBubble();
 42                                 }
 43                             },
 44                             /**
 45                              * GECKO / WEBKIT call right click
 46                              * @param {Object} ev
 47                              */
 48                             onGeckoMouse: function(ev) {
 49                                   return function(ev) {
 50                                 if (ev.button != 0) {
 51                                     RightClick.killEvents(ev);
 52                                     if(ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
 53                                         RightClick.call();
 54                                     }
 55                                     RightClick.Cache = ev.target.id;
 56                                 }
 57                               }
 58                             },
 59                             /**
 60                              * IE call right click
 61                              * @param {Object} ev
 62                              */
 63                             onIEMouse: function() {
 64                                   if (event.button > 1) {
 65                                     if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
 66                                         RightClick.call();
 67                                     }
 68                                     document.getElementById(RightClick.FlashObjectID).parentNode.setCapture();
 69                                     if(window.event.srcElement.id)
 70                                     RightClick.Cache = window.event.srcElement.id;
 71                                 }
 72                             },
 73                             /**
 74                              * Main call to Flash External Interface
 75                              */
 76                             call: function() {
 77                                 document.getElementById(this.FlashObjectID).rightClick();
 78                             }
 79                         }
 80
 81                         RightClick.init(flashObjectId);
 82                     }
 83                 ]]>
 84             </script>;
 85
 86         public function TreeRightClickManager()
 87         {
 88             return;
 89         }
 90
 91         static public function regist() : Boolean
 92         {
 93             if (ExternalInterface.available)
 94             {
 95                 ExternalInterface.call(javascript, ExternalInterface.objectID);
 96                 ExternalInterface.addCallback("rightClick", dispatchRightClickEvent);
 97                 //Application.application.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandler);
 98                 FlexGlobals.topLevelApplication.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandler);
 99
100             }
101             return true;
102         }
103
104         static private function mouseOverHandler(event:MouseEvent) : void
105         {
106             rightClickTarget = InteractiveObject(event.target);
107             return;
108         }
109
110         static private function dispatchRightClickEvent() : void
111         {
112             var event:ContextMenuEvent;
113             if(rightClickTarget !=null)
114             {
115                 event =new ContextMenuEvent(RIGHT_CLICK,true,false, rightClickTarget as InteractiveObject, rightClickTarget as InteractiveObject);
116                 rightClickTarget.dispatchEvent(event);
117             }
118             return;
119         }
120
121     }
122 }

View Code

注:必须在index.template.html设置params.wmode = "opaque"以屏蔽flash右键

转载于:https://www.cnblogs.com/frost-yen/p/4308756.html

[Flex] 组件Tree系列 —— 实现右键拓展功能相关推荐

  1. [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中分支节点

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述:阻止用户点击选中Tree中 ...

  2. [Flex] 组件Tree系列 —— 支持CheckBox组件

    主程序mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <!--功能描述:支持CheckB ...

  3. [Flex] 组件Tree系列 —— 运用LabelFunction hasChildren getChildren设置Tree包含节点个数...

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <!--功能描述:运用LabelFunc ...

  4. [Flex] 组件Tree系列 —— 利用firstVisibleItem属性,设置或取得第一个显示节点

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述: 利用firstVisib ...

  5. [Flex] 组件Tree系列 —— 运用openItems获取打开节点

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述:运用openItems获取 ...

  6. [Flex] 组件Tree系列 —— 打开和关闭节点

    mxm: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述:打开和关闭节点--> ...

  7. [Flex] 组件Tree系列 —— 作为PopUpButton的弹出菜单

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述:Tree作为PopUpBu ...

  8. [Flex] 组件Tree系列 —— 运用variableRowHeight和wordWrap设置可变行高

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!--功能描述:运用variableRow ...

  9. [Flex] 组件Tree系列 —— 支持元素的拖放排序

    mxml: 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <!--功能描述:支持元素拖放排序--& ...

最新文章

  1. flink入门_阿里巴巴为何选择Flink?20年大佬分11章讲解Flink从入门到实践!
  2. mysql 类似oracle,mysql – 制作类似于Oracle的seqences的机制
  3. telnet 以及 win10 开放端口
  4. k8s的pod资源管理与配置使用凭证的harbor仓库
  5. 如何使用 mock 数据在本地运行 SAP Fiori Elements
  6. php mysql上传多张图片_PHP开发之多个文件上传到MySql数据库(一)
  7. 解决Mac打开matlab编码问题
  8. 借贷平台Liquity昨日共有超300个Troves被清算
  9. idea打包SpringBoot项目打包成jar包和war
  10. python解base64_python模块之base64
  11. STM32F407 + Codec AK4556 + NAND Flash MX30LF2G 录音机实现
  12. 查看电脑ip地址的命令Linux,怎么用ipconfig命令查看自己电脑的IP地址
  13. python制作圣诞贺卡_制作这种动态圣诞节电子贺卡,美炸了!
  14. 黑盒测试具体有哪些操作步骤?
  15. 清除新版Google Chrome浏览器中表单控件(input,button...)默认的黑色边框
  16. JAVA面向对象(OOP)-类和对象
  17. 烽火ExMobi引领企业移动应用平台浪潮
  18. 越学越有趣:『手把手带你学NLP』系列项目02 ——语义相似度计算的那些事儿...
  19. matlab nccreate,140731SMOS数据的读取和使用
  20. 区块链媒体宣发的注意事项

热门文章

  1. CCF 2019-12 第三题 化学方程式配平(100分)
  2. springboot整合redis,用spring-data-redis2.0的同时用jedis
  3. 中国人民公安大学(PPSUC) 网络对抗技术作业
  4. C语言:输入某年某月某日,判断这一天是这一年的第几天?
  5. 《人月神话》:外科手术队伍
  6. 东元服务器显示02,东元服务器参数怎么设置
  7. Java学习笔记(第二周)
  8. 如何成为一名企业真正需要的WebGIS开发工程师
  9. 台语歌谣的奇葩── 邓雨贤
  10. 【软件体系结构】考点总结 第四章 软件体系结构描述 XJU