首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

转载 rightclickmanager 双击弹出窗口 右键屏蔽有关问题 flex 右键

2012-09-03 
转载 rightclickmanager 双击弹出窗口 右键屏蔽问题 flex 右键rightclickmanager 双击弹出窗口 右键屏蔽问

转载 rightclickmanager 双击弹出窗口 右键屏蔽问题 flex 右键
rightclickmanager 双击弹出窗口 右键屏蔽问题 flex 右键

FlexFlashCacheJavaScript工作
网上关于 rightclickmanager 类似的 flex 自定义右键文章数不胜数.

但是选择的话.还需要根据每个用户的操作来选择使用那一种方式.

比如这个
Flex屏蔽并自定义鼠标右键菜单

就是别人自己封装了rightclickmanager并且扩展了一些功能. 将用户的代码工作量减低减少

但是有一点 : 过多的封装就降低了灵活性, 这种类型有个局限性, 就是如果需要在点击右键通过远程方法

来设置右键信息. 比如使用cairngorm远程调用java来返回右键的菜单和ennable等信息时,就不适用了

这个时候就需要另一个

FLEX 屏闭系统右键菜单,及在列表控件DataGrid\Tree\List上点右键时自动选择当前行

虽说好是好. 每个人都做过改动. 这点大家要看清. 适合别人的并不一定就是最适合自己的. 像这个封装的不多. 但是如果要添加右键的话 . 代码的工作量相比上一个就多了.  如果您的工程远程交互比较强, 右键信息需要在运行时动态改变. 就得自己再做一些修改了.



------------------------------------------------


放上自己修改的 rightclickmanager  代码, 没有过多封装,比较灵活. 也减少了页面载入的代码量.

就两个类  RightClickManager.as  和 RightClickRegister.as(这个是将第一个例子的代码拿来使用,拿来主义么. 减少代码量)

RightClickManager.as


Java代码 
package com.thams.contextMenu.utils 

    import flash.display.DisplayObject; 
    import flash.events.MouseEvent; 
    import flash.external.ExternalInterface; 
     
    import mx.controls.listClasses.IListItemRenderer; 
    import mx.core.Application; 
     
    public class RightClickManager 
    { 
        static private var rightClickTarget:DisplayObject; 
        static public const RIGHT_CLICK:String = "rightClick"; 
        static private const javascript:XML =  
            <script> 
                <![CDATA[ 
                    function(flashObjectId) 
                    {                
                        var RightClick = { 
                            init: function (flashObjectId) { 
                                this.FlashObjectID = flashObjectId; 
                                this.Cache = this.FlashObjectID; 
                                if(window.addEventListener){ 
                                     window.addEventListener("mousedown", this.onGeckoMouse(), true); 
                                } else { 
                                    document.getElementById(this.FlashObjectID).parentNode.onmouseup = function() { document.getElementById(RightClick.FlashObjectID).parentNode.releaseCapture(); } 
                                    document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }} 
                                    document.getElementById(this.FlashObjectID).parentNode.onmousedown = RightClick.onIEMouse; 
                                } 
                            }, 
                            killEvents: function(eventObject) { 
                                if(eventObject) { 
                                    if (eventObject.stopPropagation) eventObject.stopPropagation(); 
                                    if (eventObject.preventDefault) eventObject.preventDefault(); 
                                    if (eventObject.preventCapture) eventObject.preventCapture(); 
                                    if (eventObject.preventBubble) eventObject.preventBubble(); 
                                } 
                            }, 
                            onGeckoMouse: function(ev) { 
                                return function(ev) { 
                                if (ev.button != 0) { 
                                    RightClick.killEvents(ev); 
                                    if(ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) { 
                                        RightClick.call(); 
                                    } 
                                    RightClick.Cache = ev.target.id; 
                                } 
                              } 
                            }, 
                            onIEMouse: function() { 
                                if (event.button ==2||event.button==0) { 
                                    if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) { 
                                        RightClick.call();  
                                    } 
                                    document.getElementById(RightClick.FlashObjectID).parentNode.setCapture(); 
                                    if(window.event.srcElement.id) 
                                    RightClick.Cache = window.event.srcElement.id; 
                                } 
                            }, 
                            call: function() { 
                                    document.getElementById(this.FlashObjectID).rightClick(); 
                            } 
                        } 
                         
                        RightClick.init(flashObjectId); 
                    } 
                ]]> 
            </script>; 
         
        public function RightClickManager() 
        { 
            return; 
        } 
         
        static public function regist() : Boolean 
        { 
            if (ExternalInterface.available) 
            { 
                ExternalInterface.call(javascript, ExternalInterface.objectID); 
                ExternalInterface.addCallback("rightClick", dispatchRightClickEvent); 
                Application.application.addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandler); 
            }// end if 
            return true; 
        } 
         
        static private function mouseOverHandler(event:MouseEvent) : void 
        { 
            rightClickTarget = DisplayObject(event.target); 
            //trace(rightClickTarget.name); 
            //rightClickTarget = (rightClickTarget is IListItemRenderer)?rightClickTarget:null; // 如果不是在列表上,则取消右键事件 
            return; 
        } 
        static private function dispatchRightClickEvent() : void 
        { 
            var event:MouseEvent; 
            if (rightClickTarget != null) 
            {    
                //trace(rightClickTarget) 
                event = new MouseEvent(RIGHT_CLICK, true,false, rightClickTarget.mouseX, rightClickTarget.mouseY); 
                rightClickTarget.dispatchEvent(event); 
            }// end if 
            return; 
        } 
        //添加在不希望出现右键菜单比如弹出窗口上 .执行即可 
        static public function setRightClickTargetNULL():void{ 
            rightClickTarget = null; 
        } 
         
         
    } 

 



setRightClickTargetNULL 方法 是本人添加的一个方法. 因为遇到这么一个问题.
一个datagrid 列表. 需要显示右键 , 其他都正常. 但是如果在条目上双击打开一个弹出窗口后.因为鼠标上次悬停对象仍然是datagird , 碰巧. 弹出窗口又是遮罩的(遮罩层无法获取鼠标over事件).这样 rightClickTarget 这个对象就是上次那个对象不为空. 这个时候.在弹出窗口上右键点击. 还会出现.

所以本人增加了这么一个方法. 在需要屏蔽右键的 PopUpManager 之前.调用一下

Java代码 
RightClickManager.setRightClickTargetNULL();// 设置弹出窗口上的右键信息失效 
例如本人的双击方法:


Java代码 
/**
* 双击执行事件
*/ 
protected function dataDoubleClickFunction():void 

    RightClickManager.setRightClickTargetNULL();// 设置弹出窗口上的右键信息失效 
    var _index:Index = this.parentApplication as Index; 
    if(_index.currentState=="sjzbState"||_index.currentState=="daglState"){ 
        _index.sjzbMain.dataGridFrame.setDtableGridObject(dtableGrid); 
        _index.sjzbMain.dataGridFrame.edit(); 
    } 
     




这样就防止了如果在鼠标没有移出监听区域打开一个遮罩窗口. 右键还存在的一个bug.


RightClickRegister.as

Java代码 
package com.thams.contextMenu.utils 

    import flash.display.Sprite; 
     
    import mx.utils.NameUtil; 
     
    [Event(name="rightClick",type="flash.events.MouseEvent")] 
    public dynamic class RightClickRegister extends Sprite 
    { 
        private var rightClickRegisted:Boolean = false; 
 
        public function RightClickRegister() 
        { 
            if (!rightClickRegisted) 
            { 
                RightClickManager.regist(); 
                rightClickRegisted = true; 
            } 
            try 
            { 
                name = NameUtil.createUniqueName(this); 
            } 
            catch (e:Error) 
            { 
            } 
            return; 
        } 
 
        public override function toString() : String 
        { 
            return NameUtil.displayObjectToString(this); 
        } 
 
    } 

这个类没什么好说的. 拿来主义 . 嘿嘿


下面说下如何使用:

因为只要注册过一次监听后. 整个工程的右键就都会屏蔽 .故本人推荐.直接在application中屏蔽掉算. (反正右键迟早都是要屏蔽的.换成自己的右键)

1. 在application 初始化方法中 new 一个RightClickRegister

例如:
Java代码 
private function init():void{ 
                new RightClickRegister();  
                var br:IBrowserManager = BrowserManager.getInstance(); 
                br.setTitle("王^林**系统"); 
            } 
这样这个application种(相信您的工程不会有多个应用吧. 有的话.就在需要屏蔽右键的地方加上这么一句话)

2. 在需要自定义右键的地方 加入监听


Java代码 
this.addEventListener(RightClickManager.RIGHT_CLICK,rightClickHandler); 


事件:
本人这里右键是通过 模块不同. 和选择的数据条目不同. 去后台判断权限生成右键的.所以右键定义在 cairngorm的回调方法中

Java代码 
protected function rightClickHandler(event:MouseEvent):void   
            {   
                removeMenu();   
                var label:String; 
                if(dtableGrid.dataLoaderClass.attr == 0){ 
                    label = "档案管理"; 
                } 
                if(dtableGrid.dataLoaderClass.attr == 1){ 
                    label = "收集整编"; 
                } 
                CairngormEventDispatcher.getInstance().dispatchEvent(new ContextMenuClassEvent(label,dtableGrid.selectedItems,contextMenuInitData)); 
            } 

cairngorm的回调方法:

Java代码 
private function contextMenuInitData(contextMenuItems:ArrayCollection):void{ 
                //contextMenuItems 是从后台获取的右键Array集合,即右键信息 
                menu = Menu.createMenu(this, contextMenuItems, false);   
                 
                menu.labelField="caption"    
                menu.variableRowHeight = true;      
                //menu.addEventListener(MenuEvent.ITEM_CLICK, menuItemClickHandler);        
                 
//              var point:Point = new Point(mouseX,mouseY);   
//              point = localToGlobal(point);    
                menu.show(stage.mouseX,stage.mouseY);    
                 
            } 
如果您不嫌麻烦的话. 还是在页面上写个方法吧. 不希望在页面上点击多次右键. 出现一堆右键吧

Java代码 
/** 
             * 如果显示过Menu,则先释放资源 
             *  
             */        
            private function removeMenu():void   
            {   
                if(menu!=null)   
                {   
                    menu.hide();   
                    //menu.removeEventListener(MenuEvent.ITEM_CLICK,menuItemClickHandler);   
                    menu=null;   
                }   
            }   
             

到此就完了. 还是那句话. 没有最适合您的. 只有自己动手.丰衣足食

贴上几个右键图片效果


两个右键判断权限后.菜生成的. 对比下效果




热点排行