flex 和 flexlib类库 实现 菜单和 TabNavigator (二)

简介: 解决 菜单重复打开问题..   按照以前的 思路自己保存一个 map 然后根据这个 map 里面的值.   来判断 是否已经打开标签.但是实际写的时候有点问题.   动态打开的标签的 children 数量 是不断减少的.   而用 delete 是删除不掉元素的.   但是发现 action的动态语言的灵活性还是挺强的.   于是 去查询文档找函数..   最

解决 菜单重复打开问题..

 

按照以前的 思路自己保存一个 map 然后根据这个 map 里面的值.

 

来判断 是否已经打开标签.但是实际写的时候有点问题.

 

动态打开的标签的 children 数量 是不断减少的.

 

而用 delete 是删除不掉元素的.

 

但是发现 action的动态语言的灵活性还是挺强的.

 

于是 去查询文档找函数..

 

最后解决直接去访问 childern 里面的元素.

 

for each (var childTab:VBox in contentId.getChildren()){
                        if(childTab.label == myLabel){//只是通过标签名字判断.如果一样就直接打开标签.
                            contentId.selectedIndex = contentId.getChildIndex(childTab);
                            //跳转到指定标签.
                            return;
                        }
                    }

 

去判断 名字是否一致. 然后 通过.

contentId.getChildIndex(childTab);

 

可以得到 index.

这样标签选项就可以跳转过去了.

 

全部的 菜单代码.如下:

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:flexlib="http://code.google.com/p/flexlib/"
    width="100%" height="100%" pageTitle="我的系统测试." 
    initialize="sdk.send();" fontSize="12">

    <mx:Script>
        <![CDATA[
        	import flexlib.events.SuperTabEvent;
        	import mx.controls.SWFLoader;
        	import mx.containers.VBox;
        	import mx.controls.Label;
	        import flexlib.controls.SuperTabBar;
			import flexlib.events.TabReorderEvent;
			import flexlib.controls.tabBarClasses.SuperTab;
			import mx.controls.Alert;
			
			[Embed(source="./assets/document.png")]
			private var document_icon:Class;
			//tab左面的图标.
			private var nodeAppOpenMap:Object = new Object();
			//定义打开app类型数组.
			
	        private function treeChanged(event:Event):void
	        {//响应树点击的双击事件.
	            var nodeApp:String = compLibTree.selectedItem.@app;
	            var nodeLabel:String = compLibTree.selectedItem.@label;
	            //app是xml里面的定义的一个属性.
	            if (nodeApp != null && nodeApp != "")
	            {//如果有app这个属性.说明这个是一个叶子节点.开始加载那个flex文件.
	                addTab(nodeLabel, contentId, nodeApp);
	                //打开选项卡.带关闭按钮的选项卡.
	            }else{//如果里面没有app这个字段.说明这个是个文件夹.
	                compLibTree.expandItem(compLibTree.selectedItem, true, true);
	                //展开文件夹显示下面的内容.
	            }
	        }
	        
	        private function addTab(myLabel:String, navigator:SuperTabNavigator,nodeApp:String):void {
	        		//进行判断.看看新添加的childTab是否在getChildern()里面.如果有就打开.否则就新建.
	        		for each (var childTab:VBox in contentId.getChildren()){
	        			if(childTab.label == myLabel){//只是通过标签名字判断.如果一样就直接打开标签.
	        				contentId.selectedIndex = contentId.getChildIndex(childTab);
	        				//跳转到指定标签.
		        			return;
	        			}
	        		}
	        		
	        		var swfLoader:SWFLoader = new SWFLoader();
	        		//动态加载flex类.在这里进行定义.每一个table新建立一个实例.
					var curNum:Number = contentId.numChildren + 1;
					var child:VBox = new VBox();
					child.setStyle("closable", true);
					//设置选项卡可以关闭.
					child.label = myLabel;
					//设置选项卡的名称.
					child.icon = document_icon;
					//设置选项卡的左面的文档图标.
					swfLoader.source = nodeApp + ".swf";
					//开始动态加载swf文件.
					child.addChild(swfLoader);
					navigator.addChild(child);
					//将加载后的swf类放到child里面,再放到navigator里面.
					contentId.selectedIndex = contentId.numChildren - 1;
			}
	        
	        private function sdkLoaded():void
	        {
	            explorerTree = XML(sdk.lastResult.node);
	            compLibTree.dataProvider = explorerTree;
	        }
        ]]>
    </mx:Script>


    <mx:HTTPService id="sdk" url="explorer.xml" resultFormat="e4x" result="sdkLoaded();"/>
    <mx:XML id="explorerTree"/>

    <mx:HDividedBox width="100%" height="100%">
        <mx:Panel width="30%" height="100%" title="测试菜单">
            <mx:Tree id="compLibTree" width="100%" height="100%" showRoot="false" labelField="@label"
            change="treeChanged(event);"/>
        </mx:Panel>
        
		<flexlib:SuperTabNavigator id="contentId" scrollSpeed="25" dropShadowEnabled="false"
			width="100%" height="100%" horizontalGap="0"
			closePolicy="{SuperTab.CLOSE_ALWAYS}" dragEnabled="false" dropEnabled="false"
			tabWidth="160"
		/>
		
    </mx:HDividedBox>
</mx:Application>

 

总结:

 

因为是类.是组件的缘故.所以 可以直接访问到属性.

方法.

是 Container 的方法和属性.

目录
相关文章
|
C# 前端开发
WPF中Style文件的引用——使用xaml代码或者C#代码动态加载
原文:WPF中Style文件的引用——使用xaml代码或者C#代码动态加载   WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观和行为,如同CSS代码一般。
4776 0
|
7月前
|
Python 容器
pyqt5-布局管理入门-信号和槽关联-菜单与工具栏-打包资源文件
pyqt5-布局管理入门-信号和槽关联-菜单与工具栏-打包资源文件
56 0
|
C++ Windows
Qt-QML-Popup,弹层界面编写
随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样。最近项目的祝界面框架都基本写完了,那自我感觉良好,感觉自己QML的不得了了,全部用的都是自己YY出来的空间,今天小伙伴在同伴代码后,用到了我的模块,给我说了一个BUG,
541 0
Qt-QML-Popup,弹层界面编写
|
前端开发 小程序 容器
02-小程序:Flex布局
02-小程序:Flex布局
194 0
02-小程序:Flex布局
|
Java iOS开发 MacOS
Java开发GUI之Button控件
Java开发GUI之Button控件
191 0
|
Java iOS开发 MacOS
Java开发GUI之Menu菜单
Java开发GUI之Menu菜单
425 0
|
Java
Java开发GUI之滚动条
Java开发GUI之滚动条
437 0
|
C#
WPF 自定义Metro Style窗体
原文:WPF 自定义Metro Style窗体 为了使WPF程序在不同版本的操作系统上保持一致的显示效果,我们需要重写WPF控件样式。这篇博客将展示如何创建一个Metro Style的WPF窗体。 首先先看一下最终窗体的效果图, 通过截图我们可以看出来这个窗体由两部分组成,顶部为最小化和关闭按钮,其他区域为窗体的显示区域。
1329 0
|
C# 前端开发
WPF 中style文件的引用
原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height、Width、Foreground、HorizontalAlignment、VerticalAlignment等属性。
958 0