FLEX 樹形菜單例子之即時搜索(四)

由於需要做一個樹形菜單的即時搜索功能,順便記下自己粗陋的實現方式

因爲需求說要保持之前樹的原狀,如之前的展開或者選中,所以用了兩個tree組件,一個是最初的,一個是用來顯示搜索的

效果圖如下:


代碼都有註釋,就不說什麼了。提一下flex中的字體 下面用了微軟雅黑,看看微軟雅黑的名稱fontFamily="Microsoft YaHei"

還有像宋體的名稱是“SimSun”

代碼如下:

<?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" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
	<fx:Declarations>
		<!-- 將非可視元素(例如服務、值對象)放在此處 -->
		<fx:XML id="treeXml">
			<root label="監控點">  
				<node id="1" label="軟件園一期" icon="iconNode_online" pid="0">  
					<node id="6" pid="1" label="望海路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304230092"/>  
					<node id="7" pid="1" label="觀日路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306250558"/> 
					<node id="12" pid="1" label="呂嶺路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
					<node id="13" pid="1" label="呂嶺路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
					<node id="14" pid="1" label="呂嶺路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
					<node id="15" pid="1" label="呂嶺路一" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
				</node>  
				<node id="2" label="軟件園二期" icon="iconNode_online" pid="0">  
					<node id="8" pid="2" label="望海路二" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1309120044"/>  
					<node id="16" pid="2" label="呂嶺路二" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
					<node id="17" pid="2" label="呂嶺路二" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
					<node id="18" pid="2" label="呂嶺路二" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1304180144"/>
				</node>  
				<node id="3" label="軟件園三期" icon="iconNode_online" pid="0">  
					<node id="9" pid="3" label="望海路三" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260224"/>
					<node id="19" pid="3" label="望海路三" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260224"/>  
					<node id="22" pid="3" label="望海路三" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260224"/>  
					<node id="23" pid="3" label="望海路三" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260224"/>  
				</node>  
				<node id="4" label="軟件園四期" icon="iconNode_online" pid="0">  
					<node id="10" pid="4" label="望海路四" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260226"/>
					<node id="32" pid="4" label="望海路四" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260226"/>  
					<node id="34" pid="4" label="望海路四" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306260226"/>  
				</node>  
				<node id="5" label="軟件園五期" icon="iconNode_online" pid="0">  
					<node id="451" pid="5" label="望海路五" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306250557"/>
					<node id="44" pid="5" label="望海路五" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306250557"/>  
					<node id="55" pid="5" label="望海路五" icon="iconNode_online" source="rtmp://42.121.0.108:9122/RpServer" videoName="S1306250557"/>  
				</node>  
			</root>  
		</fx:XML>
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			
			import spark.events.TextOperationEvent;
			[Bindable]
			private var treeData:XML;
			[Bindable]
			private var searchTreeData:XML;
			protected function application1_initializeHandler(event:FlexEvent):void
			{
				treeData = treeXml; //將XML數據賦給邦定的XML變量
			}
			//輸入框值改變處理涵數
			protected function searchText_changeHandler(event:TextOperationEvent):void
			{
				if(searchText.text == null || searchText.text == ""){
					searchContainer.visible = false;
					return;
				}
				//搜索的值的XML數據
				searchTreeData = new XML(<root label="監控點"> </root>);
				searchContainer.visible = true;
				//treeData..node查詢所有XML數據,這個是(@label.indexOf(searchText.text) != -1):過濾
				var xmlList:XMLList = treeData..node.(@label.indexOf(searchText.text) != -1);
				if(xmlList.length() == 0){ //沒找到返回
					newTree.visible = false;
					labelText.visible = true;
					return;
				}
				labelText.visible = false;
				newTree.visible = true;
				for each(var pXml:XML in xmlList){ //先找出父節點
					if(pXml.@pid == "0"){
						searchTreeData.appendChild(pXml); //加入到新的XML
					}
				}
				//找出子節點
				for each(var cXml:XML in xmlList){
					if(cXml.@pid != "0"){ //父ID不爲0
						//子節點父ID在新的XML數據中能否找到
						var nodeXml:XML = searchTreeData.node.(@id == cXml.@pid)[0];
						if(nodeXml != null){ //能找到直接追加
							//判斷是否已存在
							var nodeChild:XML = nodeXml.node.(@id == cXml.@id)[0];
							if(nodeChild == null){
								nodeXml.appendChild(cXml);
							}
						} else{ //找不到 則先找到該節點的父節點
							var pcXml:XML = cXml.parent(); //父節點
							//重新構造該XML數據,因爲後面要清除掉子節點,不然會刪掉原來的XML數據
							var tempXMl:XML = new XML(pcXml.toString()); 
							searchTreeData.appendChild(tempXMl); //追加
							//清楚下面的子節點
							delete searchTreeData.node.(@id == tempXMl.@id).node;
							//定位到該節點
							var xml:XML = searchTreeData.node.(@id == tempXMl.@id)[0];
							xml.appendChild(cXml); //追加
						}
					}
				}
				//展開所有父節點
				newTree.openItems = searchTreeData..node;
			}
			
			protected function button1_clickHandler(event:MouseEvent):void
			{
				// TODO Auto-generated method stub
				searchText.text = "";
				this.searchText_changeHandler(null);
			}
			
		]]>
	</fx:Script>
	
	<s:Panel horizontalCenter="0" title="樹查詢" width="300" height="100%">
		<s:layout>
			<s:VerticalLayout horizontalAlign="center" paddingTop="10"/>
		</s:layout>
		<s:HGroup>
			<s:TextInput id="searchText" width="180" change="searchText_changeHandler(event)"/>
			<s:Button label="清空" click="button1_clickHandler(event)"/>
		</s:HGroup>
		<s:Group height="100%">
			<mx:Tree id="oldTree" width="238" height="100%" fontFamily="Microsoft YaHei"
					 dataProvider="{treeData}" showRoot="false" labelField="@label"/>
			<s:BorderContainer height="100%" width="238" id="searchContainer" horizontalCenter="0" borderVisible="false" backgroundColor="0x666666" visible="false">
				<mx:Tree id="newTree" width="238" height="100%" contentBackgroundAlpha="0.0" fontFamily="Microsoft YaHei"
						 dataProvider="{searchTreeData}" showRoot="false" labelField="@label" visible="false"/>
				<s:Label id="labelText" horizontalCenter="0" y="20" text="暫無搜索結果" fontSize="16" visible="false"
						 fontFamily="Microsoft YaHei" color="0xffffff"/>
			</s:BorderContainer>
		</s:Group>
	</s:Panel>
	
</s:Application>


發佈了74 篇原創文章 · 獲贊 28 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章