`
cuiuse
  • 浏览: 2212 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

从头开发Flex树遇到的问题

    博客分类:
  • Flex
阅读更多
   由于项目使用的applet书出现性能问题,现在老大要求重新开发一颗Flex树,而且还要求和之前的接口保持不变(入口数据格式、方法接口等)。因为Flex提供的数据描述器不能很好解析入口数据以及数还要支持CheckBox(级联、非级联),所以我就重写了TreeDataDescriptor和TreeItemRenderer类。我按照TreeDataDescriptor提供的接口实现了相关方法,但在调试的的时候发现树一二级节点能够正确显示,点击二级节点时出现堆栈上溢异常,寻思了好久没能解决。还有一个问题就是点击二级节点时在TreeDataDescriptor的getChildren方法中node 的值为节点一级节点的值?
附上源代码:
[color=red]  tree.xml:[/color]
<treeNodes><treeNode><id>000000004000000000</id><name>全国</name><pID>-1</pID><nodeType>area</nodeType><imgURL>area.gif</imgURL><modifyDate>2010-10-18 14:59:04.0</modifyDate><checked>2</checked><temp>cn</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>010000004000000001</id><name>江苏_209</name><pID>000000004000000000</pID><nodeType>area</nodeType><imgURL>area.gif</imgURL><modifyDate>2010-10-19 09:48:49.0</modifyDate><checked>2</checked><temp>js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>010100004000000002</id><name>南京</name><pID>010000004000000001</pID><nodeType>area</nodeType><imgURL>area.gif</imgURL><modifyDate>2010-10-18 15:36:48.0</modifyDate><checked>2</checked><temp>nj.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000008</id><name><![CDATA[yin]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-19 11:10:05.0</modifyDate><checked>2</checked><temp>10.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000005</id><name><![CDATA[client]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-18 17:41:11.0</modifyDate><checked>2</checked><temp>mr.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000004</id><name><![CDATA[|{}:"?></.,';[\]-=`~!@#$%^&*()_+]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-18 15:17:37.0</modifyDate><checked>2</checked><temp>11.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000002</id><name><![CDATA[aji]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-18 15:04:07.0</modifyDate><checked>2</checked><temp>aji.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000003</id><name><![CDATA[iqpl]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-18 15:06:41.0</modifyDate><checked>2</checked><temp>iqpl.js</temp><state></state><isLeaf></isLeaf></treeNode><treeNode><id>01000120000001</id><name><![CDATA[|{}:"?></.,';[\]-=`~!@#$%^&*()_+]]></name><pID>010000004000000001</pID><nodeType>client</nodeType><imgURL>client.gif</imgURL><modifyDate>2010-10-19 10:34:01.0</modifyDate><checked>2</checked><temp>han.js</temp><state></state><isLeaf></isLeaf></treeNode></treeNodes>

[color=red]TreeDataDescriptor :[/color]
package com.smc.ascode
{
	import mx.collections.ICollectionView;
	import mx.collections.XMLListCollection;
	import mx.controls.treeClasses.DefaultDataDescriptor;

	public class TreeDataDescriptor extends DefaultDataDescriptor 
	{
		private var tree:Tree;
		public function TreeDataDescriptor(tree:Tree)
		{
			super();
			this.tree=tree;
		}

		public override function getChildren(node:Object, model:Object=null):ICollectionView
		{
			var xmlList:XMLListCollection=new XMLListCollection();
			if(node is XML)
			{
				var nodeXML:XML=XML(node);
				var tag:String=String(nodeXML.name()).toLowerCase();
				if("treenodes"==tag)
				{
					var childList:XMLList=nodeXML.elements("treeNode");
					var fnodeList:XMLListCollection=new XMLListCollection();
					for each(var o:XML in childList)
					{
						var parentID:String=o.pID;
						var id:String=o.id;
						if("-1"==parentID||!parentID)
						{
							 xmlList.removeAll();
							 xmlList.addItem(o);
							 break;
						}
						else
						{
							if(!SMCTreeUtil.nodeExsist(parentID,childList))
							{
								 xmlList.addItem(o);
							}
							else
							{
								var fNode:XML=SMCTreeUtil.getTopLeval(parentID,childList);
								if(!fNode){continue;}
								var fNodeId:String=fNode.id;
								var exist:Boolean=false;
								for each(var n:XML in xmlList)
								{
									if(fNodeId==n.id){exist=true;}
								}
								if(!exist)
								{ 
								   xmlList.addItem(o);
								}
							}
						}
					}
				}
				else if("treenode"==tag)
				{
				  	var nodeId:String=nodeXML.id;
				  	trace("getChildren \n");
				  	return	SMCTreeUtil.childs(nodeId,this.tree.xmlData);
				}
			}
			return xmlList;
		}
		
		public override function hasChildren(node:Object, model:Object=null):Boolean
		{
			var nodeXML:XML=XML(node);
			var tag:String=String(nodeXML.name()).toLowerCase();
			if("treenodes"==tag)
			{
				var nodeList:XMLList=nodeXML.elements("treeNode");
				if(0<nodeList.length())
				{
					return true;
				}
			}
			else
			{
				var id:String=nodeXML.id;
				trace("hasChildren \n");
				var childsList:XMLListCollection=SMCTreeUtil.childs(id,this.tree.xmlData);
				if(childsList&&0<childsList.length)
				{
					return true;
				}
				return true;
			}
			return false;
		}
		
		public override function isBranch(node:Object, model:Object=null):Boolean
		{
			if(node is XML)
			{
				var nodeXML:XML=XML(node);
				var tag:String=String(nodeXML.name()).toLowerCase();
				if(tag=="treenodes")
				{
					var nodeList:XMLList=nodeXML.elements("treeNode");
					if(0<nodeList.length())
					{
						return true;
					}
					return false;
				}
				else if(tag=="treenode")
				{
					var isLeafs:XMLList=nodeXML.elements("isLeaf");
					if(!isLeafs&&isLeafs.children())
					{
						var value:String=isLeafs.toString();
						trace("value:"+value);
						//获取isLeaf的值,如果值为xx的时候返回true/false
					}
					else
					{
						//根据node id查找是否有子节点,如果有则反true,如果没有则返回false
					}
				}
				
			}
			return true;
		}
		
		public override function getData(node:Object, model:Object=null):Object
		{
			return super.getData(node,model);
		}
		
		public override function addChildAt(parent:Object, newChild:Object, index:int, model:Object=null):Boolean
		{
			return super.addChildAt(parent,newChild,index,model);
		}
		
		public override function removeChildAt(parent:Object, child:Object, index:int, model:Object=null):Boolean
		{
			return super.removeChildAt(parent,child,index,model);
		}
	}
}


[color=red]TreeItemRenderer :[/color]
package com.smc.ascode
{
	import mx.controls.treeClasses.TreeItemRenderer;
    import mx.core.*;
	public class TreeItemRenderer extends mx.controls.treeClasses.TreeItemRenderer
	{
		public  static var res:Resource=new Resource();
		//是否有checkBox
        private var hasCheckBox:Boolean=false;	
        //节点类型
        private var nodeType:String;
        	
        /**
         *构造函数
         */ 
		public function TreeItemRenderer()
		{
			super();
		}
	}
}


附件为源码包,里面包数据及代码。程序要经过修改才可以运行。开发工具版本:Flex Bulider 3.0
分享到:
评论

相关推荐

    Developing Flex 4 Components

    ### 开发Flex 4组件——深入理解Flex 4程序开发 #### 一、书籍概述与评价 《开发Flex 4组件》是一本针对初学者及经验丰富的开发者所编写的优秀书籍,尤其对于想要深入了解Flex 4组件开发的技术人员来说,本书具有...

    FLEX时间轴代码

    在研究这个FLEX时间轴代码时,你可能会遇到以下关键概念和技术: 1. **MXML**:这是FLEX中的声明式语言,类似于HTML,用于定义用户界面的布局和组件。在时间轴代码中,MXML可能包含时间轴组件的定义、属性设置和...

    Flex常用教程及库

    9. **调试和问题解决**:分享一些常见的问题和解决方法,帮助开发者在遇到困难时能够迅速定位和修复问题。 通过阅读这份教程,开发者不仅可以掌握PureMVC的基本用法,还能理解其背后的MVC设计模式,从而提升在Flex...

    编译原理实验工具FLEX251+BISON,

    总的来说,FLEX和BISON是编译原理教学和研究的得力助手,它们简化了编译器开发的流程,使得开发者可以专注于语言的定义和实现,而不是底层的解析技术。这两个工具的使用不仅限于学术环境,也广泛应用于工业界,用于...

    ubuntu10.10下嵌入式QT开发环境搭建手记[借鉴].pdf

    作者从头开始搭建环境,遇到了许多问题,但最终成功搭建了环境。下面是环境搭建过程中的关键步骤和注意事项。 1. 下载 QT SDK for Linux/X11 32-bit 首先,需要从 QT 官方网站下载 QT SDK for Linux/X11 32-bit...

    编译原理实验源代码

    在实际开发中,词法分析器可以使用现成的库(如Flex或JavaCC)来生成,也可以从头编写。无论哪种方式,理解词法分析的基本原理对于任何希望深入学习编译器技术的人来说都是至关重要的。通过实践,你可以更深刻地理解...

    C++ 代码解析(词法分析、语法分析).docx

    在软件开发中,尤其是涉及到编译器或解释器的设计时,代码解析是一个重要的步骤。它包括词法分析和语法分析两个阶段。词法分析(也称为扫描或词法分解)是将源代码分解成一个个有意义的单元——记号(Token),而...

    lex yacc的介绍文档和工具 学习编译原理不容错过

    词法分析和语法分析是编译器设计的基础,lex和yacc提供了一种自动化的方法来处理这两个步骤,使得开发者可以专注于语法规则和高级逻辑,而不是从头实现底层的解析机制。 **lex (flex) 知识点** 1. **工作原理**:...

    词法分析器_编译原理_带报告

    8. **问题与改进**:总结遇到的问题和解决方案,以及未来可能的改进方向。 通过这个课程设计,你不仅可以掌握词法分析器的工作原理,还能提升编程技能,理解编译器设计的核心概念,这对于任何想要深入理解计算机...

    使用PureMVC构建FLASH网站

    该框架开源且免费,最初为ActionScript 3语言以及Adobe Flex、Flash和AIR平台开发,现已扩展至大多数主流开发平台。 - **版本**:目前PureMVC支持两种版本——标准版和多核版。标准版提供了简洁的编码分离方法,遵循...

    编译原理课程设计 逆波兰 算符优先 正则图

    在这个项目中,你可以使用各种工具和语言,如ANTLR、Flex和Bison进行语法分析,或者使用Python、Java等编程语言从头实现。同时,理解正则表达式与正则图的关系,以及如何将它们应用于实际问题,是提升编译技术理解的...

    as3xls-1.0.1

    7. **错误处理**:提供适当的错误处理机制,确保在遇到无效数据或文件结构问题时能够适当地报告和处理。 在实际项目中,as3xls库可以应用于在线报表工具、数据导入/导出功能、数据可视化应用,甚至教育软件中创建...

    编译原理实现课-词法分析器编写

    可能的实现方式包括使用已有的工具,如Flex和Bison,或者从头编写自定义的词法分析算法。这涉及到对正则表达式的理解和运用,以及如何将它们转化为状态机模型。 通过这个实践,你将深入理解编程语言的底层工作原理...

    Ubuntu_10.04下编译Android源码全过程

    解决这些问题的关键在于正确安装所需的开发库和工具。 **解决编译错误与安装所需软件:** 1. **解决zlib.h错误**:编译过程中可能会遇到`zlib.h`找不到的错误,这通常是因为系统中缺少`zliblg-dev`包。可通过`sudo...

    编译原理生成一个简易的计算器

    接下来,我们需要一个词法分析器(如`Flex`,在这里的`win_flex_bison-latest`可能包含此工具)来识别输入流中的单个符号。词法分析器会将输入的字符序列转换为一系列的标记(tokens),如整数、运算符等,然后传递...

Global site tag (gtag.js) - Google Analytics