zoukankan      html  css  js  c++  java
  • 如何在TWaver Flex中定制Tree的tooltip

    如果您显示过Tree的ToolTip,会发现这个tooltip离鼠标太远了;而且也无法跟随鼠标一起移动;最重要的是,如果想动态更改tooltip也很麻烦。

    还是自定义ToolTip灵活:

    1. 设置tree.toolTipFunction,关闭默认的tooltip

    tree.toolTipFunction = function(element:IData):String {
    	return null;
    }

    2. 监听mousemove事件,动态显示、隐藏以及更新tooltip

    tree.addEventListener(MouseEvent.MOUSE_MOVE, function(e:MouseEvent):void {
    	handleMouseMove(e);
    });

    3. 由于tree.getTreeDataByMouseEvent方法中,即使鼠标在空白处也有返回值,所以需要特殊处理一下,判断鼠标是否在icon或者text上:

    private function showToolTip():Boolean {
    	var obj:InteractiveObject = null;
    	var mousePoint:Point = new Point(stage.mouseX, stage.mouseY);
    	var objects:Array = stage.getObjectsUnderPoint(mousePoint);
    	for (var i:int = objects.length-1; i>=0; i--) {
    		if (objects[i] is InteractiveObject) {
    			obj = objects[i] as InteractiveObject;
    			break;
    		} else {
    			if (objects[i] is Shape && (objects[i] as Shape).parent) {
    				obj = (objects[i] as Shape).parent;
    				break;
    			}
    		}
    	}
    	return obj is UIComponent || obj is UITextField;
    }

    效果如下:

    完整代码: 

    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    				xmlns:tw="http://www.servasoftware.com/2009/twaver/flex"
    				paddingLeft="0" paddingRight="0" paddingTop="0" paddingBottom="0" backgroundColor="#FFFFFF"
    				creationComplete="init()">
    	<mx:Script>
    		<![CDATA[
    			import mx.core.IToolTip;
    			import mx.core.UIComponent;
    			import mx.core.UITextField;
    			import mx.managers.ToolTipManager;
    
    			import twaver.DataBox;
    			import twaver.IData;
    			import twaver.Link;
    			import twaver.Node;
    			import twaver.controls.TreeData;
    
    			private var _toolTip:IToolTip;
    			private var _lastData:IData = null;
    			private var _timer:uint = 0;
    
    			private function init():void {
    				var box:DataBox = tree.dataBox;
    				tree.toolTipFunction = function(element:IData):String {
    					return null;
    				};
    				tree.addEventListener(MouseEvent.MOUSE_MOVE, function(e:MouseEvent):void {
    					handleMouseMove(e);
    				});
    				tree.callLater2(function():void {
    					tree.expandAll();
    				});
    
    				var from:Node = new Node();
    				from.name = "From";
    				from.toolTip = "From";
    				from.centerLocation = new Point(100, 100);
    				box.add(from);
    				var to:Node = new Node();
    				to.name = "To";
    				to.toolTip = "To";
    				to.centerLocation = new Point(300, 400);
    				box.add(to);
    				var link:Link = new Link(from, to);
    				link.name = "Link";
    				link.toolTip = "Link";
    				box.add(link);
    			}
    
    			private function handleMouseMove(e:MouseEvent):void {
    				var treeData:TreeData = tree.getTreeDataByMouseEvent(e);
    				var data:IData = (showToolTip() && treeData && treeData.data) ? treeData.data : null;
    				if(data != null){
    					var x:Number = tree.mouseX + 10, y:Number = tree.mouseY + 10;
    					if(data != _lastData){
    						if(_toolTip != null){
    							ToolTipManager.destroyToolTip(_toolTip);
    						}
    						_toolTip = ToolTipManager.createToolTip(data.toolTip, x, y);
    						if(_timer){
    							clearTimeout(_timer);
    						}
    						_timer = setTimeout(function():void {
    							_timer = 0;
    							if(_toolTip){
    								_toolTip.text = "test\n" + _toolTip.text;
    							}
    						}, 1000);
    					}else{
    						_toolTip.x = x;
    						_toolTip.y = y;
    					}
    
    				}else{
    					if(_toolTip != null){
    						ToolTipManager.destroyToolTip(_toolTip);
    					}
    					_toolTip = null;
    				}
    				_lastData = data;
    			}
    
    			private function showToolTip():Boolean {
    				var obj:InteractiveObject = null;
    				var mousePoint:Point = new Point(stage.mouseX, stage.mouseY);
    				var objects:Array = stage.getObjectsUnderPoint(mousePoint);
    				for (var i:int = objects.length-1; i>=0; i--) {
    					if (objects[i] is InteractiveObject) {
    						obj = objects[i] as InteractiveObject;
    						break;
    					} else {
    						if (objects[i] is Shape && (objects[i] as Shape).parent) {
    							obj = (objects[i] as Shape).parent;
    							break;
    						}
    					}
    				}
    				return obj is UIComponent || obj is UITextField;
    			}
    		]]>
    	</mx:Script>
    	<tw:Tree id="tree" width="30%" height="100%"/>
    </mx:Application>

     完整代码见附件:见原文最下方

  • 相关阅读:
    sql server 中各个系统表的作用==== (转载)
    后台动态设置前台标签内容和属性
    利用C#编写一个简单的抓网页应用程序
    如何创建和使用Web Service代理类
    jdbc如何取得存储过程return返回值
    子窗口和父窗口的函数或对象能否相互访问 (转载)
    把aspx文件编译成DLL文件
    C#中的类型转换
    c#中对文件的操作小结
    转贴一篇 自定义数据库 希望对你有帮助
  • 原文地址:https://www.cnblogs.com/twaver/p/2694907.html
Copyright © 2011-2022 走看看