`
pizazz_ex
  • 浏览: 20148 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

可以辅助选择的文本框

阅读更多
组件是辅助选择的文本框,可以使用上下键选择,可以采用自定义数据,可以和后台进行交互,需要用到组件RemoteConn(已贴出)
组件代码:
package pizazz.flex4.component{
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import flash.events.FocusEvent;
	import flash.events.KeyboardEvent;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.utils.Timer;
	import mx.collections.ArrayCollection;
	import mx.collections.ArrayList;
	import mx.collections.IList;
	import mx.collections.XMLListCollection;
	import mx.events.FlexEvent;
	import mx.events.FlexMouseEvent;
	import mx.events.ListEvent;
	import mx.managers.PopUpManager;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.RemoteObject;
	import pizazz.flex4.remote.RemoteConn;
	import spark.components.List;
	import spark.components.SkinnableContainer;
	import spark.components.TextInput;
	import spark.events.IndexChangeEvent;

	public class AutoTextInput extends TextInput{
		protected var _param:Object = {};
		protected var _rowCount:uint = 10;
		protected var _popUpList:List;
		protected var _labelField:String = "";
		protected var _dataField:String = "";
		protected var _isCustomData:Boolean = false;
		protected var _dataProvider:IList;
		protected var _wait:uint = 500;
		private var _changeFunction:Function;
		private var _parseFunction:Function;
		private var _isQuickSelect:Boolean = true;
		private var _value:String = "";
		private var _destination:String;
		private var _method:String = "loadName";
		private var _source:IList;
		private var _keyIndex:int = -1;
		private var _container:SkinnableContainer;
		private var _remote:RemoteObject;
		private var _showingPopUp:Boolean = false;
		private var _timer:Timer;
		/**
		 * 设置快速匹配,当输入和自动选择相同时,自动匹配
		 */  
		public function set isQuickSelect(value:Boolean):void{
			_isQuickSelect = value;
		}
		/**
		 * 设置value值,备用取值参数
		 */ 
		public function set value(value:String):void{
			_value = value;
		}
		/**
		 * 获取value值,备用取值参数
		 */ 
		public function get value():String{
			return _value;
		}
		/**
		 * 设置选择时调用函数
		 */ 
		public function set changeFunction(value:Function):void{
			_changeFunction = value;
		}
		/**
		 * 设置自定义解析函数(只对自定义数据源有效)
		 */ 
		public function set parseFunction(value:Function):void{
			_parseFunction = value;
		}
		/**
		 * 设置通道描述
		 */ 
		public function set destination(value:String):void{
			_destination = value;
		}
		/**
		 * 设置查询方法
		 */ 
		public function set method(value:String):void{
			_method = value;
		}
		/**
		 * 设置处理后显示最大数目
		 */ 
		public function set rowCount(value:uint):void{
			_rowCount = value;
		}
		/**
		 * 设置显示字段
		 */ 
		public function set labelField(value:String):void{
			_labelField = value;
		}
		/**
		 * 设置value字段
		 */ 
		public function set dataField(value:String):void{
			_dataField = value;
		}
		/**
		 * 设置查询参数
		 */ 
		public function set param(value:Object):void{
			_param = value;
		}
		/**
		 * 设置自定义数据源
		 */ 
		public function set dataProvider(value:IList):void{
			_source = value;
			_isCustomData = true;
		}
		/**
		 * 获取数据源
		 */ 
		public function get dataProvider():IList{
			return _dataProvider;
		}
		/**
		 * 是否采用自定义设置数据源
		 */ 
		public function set isCustomData(value:Boolean):void{
			_isCustomData = value;
		}

		public function AutoTextInput(){
			super();
			//percentWidth = 100;
			addEventListener(FlexEvent.CREATION_COMPLETE, initHandler);
		}
		/**
		 * 重置连接
		 * @param destination 通道描述
		 * @param param 查询参数
		 * @param method 查询方法
		 */ 
		public function resetRemote(destination:String, 
				param:Object = null, method:String = ""):void{
			if(destination && destination != ""){
				_remote = RemoteConn.getRemote(destination, 
					resultHandler, {"showBusyCursor": false});
				text = "";
				_value = "";
				_param = param;
				if(method != ""){
					_method = method;
				}
			}
		}
		/**
		 * 清除数据
		 */ 
		public function clear():void{
			text = "";
			_value = "";
		}

		override protected function createChildren():void{
			super.createChildren();
			_popUpList = new List();
			_popUpList.labelField = _labelField;
			_container = new SkinnableContainer();
			_container.includeInLayout = false;
			_container.visible = false;
			_container.addElement(_popUpList);
			_timer = new Timer(_wait, 1);
		}

		override protected function focusOutHandler(event:FocusEvent):void{
	        if (_showingPopUp && _container && !event.relatedObject){
	            removeHandler(event);
	        }
	        super.focusOutHandler(event);
	    }

		private function initHandler(event:Event):void{
			if(_destination){
				_remote = RemoteConn.getRemote(_destination, 
					resultHandler, {"showBusyCursor": false});
			}
			setEventListeners();
		}

		private function setEventListeners():void{
			addEventListener(Event.CHANGE, changeHandler);
			addEventListener(KeyboardEvent.KEY_DOWN, downHandler);
			_popUpList.addEventListener(
				IndexChangeEvent.CHANGE, listChangeHandler);
			_container.addEventListener(
				FlexMouseEvent.MOUSE_DOWN_OUTSIDE, removeHandler);
			_container.addEventListener(
				FlexMouseEvent.MOUSE_WHEEL_OUTSIDE, removeHandler);
			_timer.addEventListener(TimerEvent.TIMER, doChangeHandler);
		}

		private function resultHandler(event:ResultEvent):void{
			var _result:Object = event.result;
			if(_result && _result.length > 0){
				var _impl:IList;
				if(_result is String){
					var _xmlList:XMLList = XML(_result).node;
					_impl = new XMLListCollection(_xmlList);
				}else if(_result is ArrayCollection){
					_impl = _result as ArrayCollection;
				}else if(_result is IList){
					_impl = _result as IList;
				}
				if(_impl){
					_showingPopUp = true;
					createHandler(event);
					_popUpList.dataProvider = (_dataProvider = _impl);
					if(_isQuickSelect){
						quickSelect(_impl);
					}
					return;
				}
			}
			removeHandler(event);
		}

		private function changeHandler(event:Event):void{
			_value = "";
			_keyIndex = -1;
			if(text != ""){
				_timer.reset();
				_timer.start();
			}else{
				removeHandler(event);
			}
		}

		private function doChangeHandler(event:TimerEvent):void{
			_param = _param ? _param : {};
			if(_destination != null){
				_param["s"] = text;
				_param["u"] = _rowCount;
				_remote.getOperation(_method).send(_param);
			}else if(_isCustomData){
				var _result:IList = _parseFunction != null ? 
					_parseFunction(_param) : parseCustomData();
				resultHandler(new ResultEvent(ResultEvent.RESULT, 
					false, true, _result));
			}
		}

		private function listChangeHandler(event:Event):void{
			var _out:Object = listSelectHandler();
			if(_changeFunction != null){
				_changeFunction(_out);
			}
			removeHandler(event);
		}

		private function createHandler(event:Event):void{
			_popUpList.width = width;
			_container.width = width;
			//以下参考PopUpButton.as
			var initY:Number;
			var point:Point = new Point(0, unscaledHeight + 0);
			point = localToGlobal(point);
			if (_container.parent == null){
                PopUpManager.addPopUp(_container, this);
                _container.owner = this;
            }else{
            	PopUpManager.bringToFront(_container);
            }
            point = _container.parent.globalToLocal(point);
        	if (point.y + _container.height > screen.height && point.y > 
					(height + _container.height)){ 
                point.y -= (unscaledHeight + _container.height);
                initY = -_container.height;
            }else{
  				initY = _container.height;
  			}
            point.x = Math.min(point.x, screen.width - 
				_container.getExplicitOrMeasuredWidth());
            point.x = Math.max(point.x, 0);
            if (_container.x != point.x || _container.y != point.y){
            	_container.move(point.x, point.y);
            }
			if(!_container.visible){
				_container.visible = true;
			}
			//end
		}

		private function removeHandler(event:Event):void{
			if(_showingPopUp){
				PopUpManager.removePopUp(_container);
				_showingPopUp = false;
				_keyIndex = -1;
			}
		}

		private function listSelectHandler():Object{
			var _item:Object = _popUpList.selectedItem;
			text = _item[_labelField];
			_value = _item[_dataField];
			return _item;
		}

		protected function quickSelect(impl:IList):void{
			var _item:Object = impl.getItemAt(0);
			if(_item[_labelField] == text){
				_value = _item[_dataField];
			}
		}

		protected function downHandler(event:KeyboardEvent):void{
			if(_showingPopUp){
				if(event.keyCode == 40){
					_popUpList.selectedIndex = (_keyIndex = _keyIndex < 
						_dataProvider.length - 1 ? _keyIndex + 1 : 0);
					listSelectHandler();
				}else if(event.keyCode == 38){
					_popUpList.selectedIndex = (_keyIndex = _keyIndex >=
						1 ? _keyIndex - 1 : _dataProvider.length - 1);
					listSelectHandler();
				}else if(event.keyCode == 13){
					listChangeHandler(event);
				}
				event.stopPropagation();
			}
		}

		protected function parseCustomData():IList{
			var _result:IList = new ArrayList();
			var _num:uint = 0;
			var _length:int = _source.length;
			for(var _i:int = 0; _i < _length; _i ++){
				var _item:Object = _source.getItemAt(_i);
				if(_num >= _rowCount){
					break;
				}
				if((_item[_labelField] + "").indexOf(text) != -1){
					_result.addItem(_item);
					_num ++;
				}
			}
			return _result;
		}
	}
}

组件执行:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   xmlns:component="pizazz.flex4.component.*"
			   minWidth="955" minHeight="600" >
	<s:layout>
		<s:VerticalLayout />
	</s:layout>
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.collections.XMLListCollection;
			import mx.controls.Alert;

			private const xml:XML = 
				<root>
					<node id="a" name="ABC" />
					<node id="b" name="BCD" />
					<node id="c" name="DEF" />
					<node id="d" name="EFG" />
					<node id="e" name="GAB" />
					<node id="f" name="ACE" />
					<node id="f" name="CEG" />
					<node id="f" name="EGB" />
					<node id="f" name="GBD" />
					<node id="f" name="BDF" />
				</root>;

			private const _arr:ArrayCollection = new ArrayCollection([
				{"id": "a", "name": "ABC"},
				{"id": "b", "name": "BCD"},
				{"id": "c", "name": "DEF"},
				{"id": "d", "name": "EFG"},
				{"id": "e", "name": "GAB"},
				{"id": "f", "name": "ACE"},
				{"id": "g", "name": "CEG"},
				{"id": "h", "name": "EGB"},
				{"id": "i", "name": "GBD"},
				{"id": "j", "name": "BDF"}
			]);

			private const _list:XMLListCollection = 
				new XMLListCollection(XMLList(xml.node));
		]]>
	</fx:Script>
	<s:Label text="XMLListCollection格式" />
	<component:AutoTextInput labelField="@name" dataField="@id" 
		rowCount="10" dataProvider="{_list}" />
	<s:Label text="ArrayCollection格式" />
	<component:AutoTextInput id="input" labelField="name" dataField="id" 
		rowCount="10" dataProvider="{_arr}" />
	<mx:Button label="value参数" click="{Alert.show(input.value)}" />
</s:Application>

视图:

  • 大小: 2 KB
分享到:
评论

相关推荐

    自定义 wpf 文本框输入自动下拉提示控件,可以设置延迟时间,输入字符长度来查询

    自定义 wpf 文本下拉框控件,输入字符自动模糊查询,下拉显示出来,可配置,输入多长后去服务端拿数据显示,也可配置,输入文字后几毫秒去查询

    域名批量查询辅助软件,域名抢注辅助软件,域名抢注软件

    域名批量查询辅助软件,域名抢注辅助软件,域名抢注软件 软件可以批量查询域名类型: 1。26个字母组合查询所有域名类型,如有未被注册的就添加到下面的文本框 2。2个字母组合查询所有域名类型,如有未被注册的就...

    PPT文本框对齐小技巧.rar

    PPT文本框对齐小技巧。首先将形状对齐时显示智能向导勾选上,这样拖动对象时,就会出现参考线辅助对齐...在文本框上右键,选择设置形状格式,在文本框中设置内部边距,将各项设置为0,这样文本框与文本间就没有距离了。

    序列号辅助输入机

    利用键盘钩子监控键盘,当按下F11键,可以将剪贴板的内容发送到当前光标所在处,可以用来辅助输入QQ密码等受限制的文本框。

    辅助输入功能--BSKeyboardControls

    除了解决一般键盘遮挡文本框问题外,BSKeyboardControls还提供了辅助输入功能,如果你选错了输入框,不必解除键盘再进行选择,而是可以通过键盘左上角的“上一个”和“下一个”提示选择正确的输入框,所以这个项目更...

    HTML5 带动画效果的限制文本框字数.rar

    HTML5 带动画效果的限制文本框字数,这个功能的实现主要是引入了rectjs文件,当用户输入的时候,适时显示还可以输入多少个字符,并且辅助动画形式来显示,十分动感,下方的红线标识将可输入的字数与总字数计算,生成...

    计算机辅助设计(“图层”文档)共33张.pptx

    利用高度文本框确定属性文本字符的高度; 该对话框中各选项的含义分别如下所示: 在插入的同时还可以改变所插入块或图形的比例与旋转角度。 2.基点选项区 用于设置块插入的基点位置。 图 图层特性管理器对话框 ...

    js光标定位文本框回车表单提交问题的解决方法

    当光标定位在辅助查找的文本框后回车,页面会出现方法的返回的json串。 原因:When there is only one single-line text input field in a form, the user agent should accept Enter in that field as a request to...

    6HTML辅助.txt

    强类型视图HTML的各种辅助方法使用,比如 form 表单,提交方式,显示文本框等等,这是前端和初学者都可以用到的.

    57个易语言支持库(part2)

    RichTextBox丰富文本框支持库(1.2#3共享版)云外归鸟 Taolibv★诺亚鸿飞增强库★(1.1#0版)吴江涛 Tooltiplib提示工具支持库(1.1#0版)银戒指 WaveEffect水波特效支持库(1.0版)[OpenGL] WebBrowser2_WEB浏览器...

    序列号输入辅助程序(绿色软件299K)SnInput

    序列号输入辅助程序 绿色小软件. 复制序列号-点击要输入的序列号文本框-按F11-完成.

    北语20秋《计算机基础》作业3-辅导资料.doc

    选择"插入"菜单中的"文本框"命令,然后在新建的文本框内输入图表 C.选择"插入"菜单中的"对象"命令,然后在"插入对象"对话框中选择有关选项 D.选择"插入"菜单中的"新幻灯片"命令,选择具有"图表"的自动版式 参考选择...

    一个jQuery辅助的字符类型输入限制插件.rar

    一个jQuery辅助的字符类型输入限制插件,这个插件是先限制再输入,也就是当用户输入的时候,输入了不允许的字符,则不自动过滤掉该字符,不会显示在文本框中。这款插件的名字叫做jQuery AlphaNumeric,by Paulo P. ...

    基于Qt和C++实现的FlatUI辅助类之各种炫酷的控件集合+源码

    用法链接:... FlatUI辅助类之各种炫酷的控件集合 按钮样式设置。 文本框样式设置。 进度条样式。 滑块条样式。 单选框样式。 滚动条样式。 可自由设置对象的高度宽度大小等。 自带默认参数值。

    楼月文本自动输入器 v3.0.zip

    楼月文本自动输入器是一款辅助输入文本的软件,您只需要按下您设置好的热键,该热键对应的文字内容将自动输入到当前的输入框中,大大节省了您在键盘上的输入时间,降低了您的劳动强度并极大地提高了工作效率。...

    Axure RP 8.1.0.3399 WinmacOS 一款专业的交互原型设计软件(UIUX交互原型设计软件).rar

    您可以在线框中选择一些控件信息并在“注释和交互”面板的字段中编辑值,从而对其进行分析注释。面板模型顶部的标签数据字段向控件添加了我们一个网络标识符。 脚注 在向控件添加注释后,控件的右上角会显示一个名...

    史上最强JavaScript日历控件正式版(无偿的永久的提供给大家免费使用,含全部源代码)

    系统提供了$dp.$D和$dp.$DV这两个API来辅助你进行日期运算,此外你还可以通过在 #F{} 中填入你自定义的脚本,做任何你想做的日期限制 三、自定义事件和丰富的API库 如果你需要做一些附加的操作,你也不必担心,日期...

    免费辅助自动算出汉字笔画软件,2012查询汉字笔画3.0最新版

    中、小学生免费辅助自动算出汉字笔画软件,2012查询汉字笔画3.0最新版在“汉字输入”框中输入汉字,汉字的笔画就显示在相应的文本框中; 当前汉字(光标处)的笔画显示在“当前汉字及笔画”处; 当选定汉字时,相应...

    决策信息系统(有运畴学、工程经济学等内容) VB+SQL

    文件查询模块操作说明:在名称文本框中输入要查找的文件名称,在目录文本框中选择目录,如要选择更下一级目录,可在文件列表框选择,单击“查找”按钮,便可查找出所需要的文件;在查找结果的列表框中单击某一文件,...

    Ofbiz之LOOKUP字段使用方法

    Ofbiz的Lookup字段,讲解ofbiz辅助输入,包括文本,选择框,日期,时间,主从文本框。后面还介绍一下自定义修改的Lookup

Global site tag (gtag.js) - Google Analytics