`

用flex做一个树

阅读更多
想用flex写一个树;查看了blazeds自带的数据库管理的例子,发现这个树形很有局限,只能显示一级。(如果不正确请赐教)于是在网上找例子,都是将xml文件导入到flex中。开始还不想用这样的方法。折腾了两个星期,最后决定还是使用这种方法了;那么思路就很清晰了,从数据库中查出数据,然后用dom4j来生成xml文件,然后将xml文件导入到flex工程中。如果要实现动态加载再改。一步一步来。先实现将数据转换为xml文件;
1.找一个使用dom4j来生成xml文件的例子
XmlBuild.java
package main;
import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class XmlBuild {
	public Document Create() {
		String filepath = this.getClass().getResource("/").getPath();// 得到当前WEB-INF相对路径
		Document document = DocumentHelper.createDocument(); // 创建document对象
		Element root = document.addElement("menus"); // 新加�1个menus元素
		//root.addComment("An XML Catalog"); // 加注释
		//root.addProcessingInstruction("target", "text"); // 加一个指�?
		Element journalElement = root.addElement("node"); // 在menus下加�?个name节点
		journalElement.addAttribute("label", "内容"); // 给name添加title属性,并设置他的值�为XML
															// Zone
		journalElement.addAttribute("href", "链接地址");
		journalElement.addAttribute("target", "在那一页面显示");
		
		
		Element articleElement = journalElement.addElement("node"); // 给name节点添加�?个article节点
		articleElement.addAttribute("label", "内容"); // 给article添加level属�?�,并设置他的�?�为Intermediate
		articleElement.addAttribute("href", "链接地址");
		articleElement.addAttribute("target", "在那一页面显示");
		/*Element titleElement = articleElement.addElement("title");
		// 使用 setText() 方法设置 article 元素的文�?
		titleElement.setText("Java configuration with XML Schema"); // 设置title的文本内�?
		// 向article元素中添加author元素
		Element authorElement = articleElement.addElement("author");
		// 向author元素中添加firstname,lastname元素,并用setText()设置他们的文�?
		Element firstNameElement = authorElement.addElement("firstname");
		firstNameElement.setText("Marcello");
		Element lastNameElement = authorElement.addElement("lastname");
		lastNameElement.setText("Vitaletti");*/
		// return document;
		// }
		// 使用 addDocType() 方法添加文档类型说明
		// document.addDocType("catalog",null,"file://c:/Dtds/catalog.dtd");
		try {
			OutputFormat format = OutputFormat.createCompactFormat(); // 按格式输出xml文挡
			format.setEncoding("UTF-8"); // 设置encoding为utf-8
			XMLWriter output = new XMLWriter(new FileWriter(filepath
					+ "mycatalog.xml"), format); // 按格式新建一个xml文档
			output.write(document); // 将document对象写入xml文档
			output.close(); // 关闭XMLWriter对象
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		return document;
	}

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		XmlBuild create = new XmlBuild();
		create.Create();
	}
}

2.将生成的的xml文件放到一个可以调用xml文件生成树的mxml中。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
     fontFamily="simsun" fontSize="12" 
     layout="absolute" creationComplete="menu.send();" initialize="init()">
<mx:Script>
    <![CDATA[
    	import mx.controls.Alert;
    	import mx.events.ListEvent;
         import mx.collections.ArrayCollection;
         import mx.rpc.events.ResultEvent;
         import mx.managers.PopUpManager;
         
         [Bindable]//这里就是导入xml文件的地方
         private var strUrl:String = "mycatalog.xml";
         [Bindable]
         private var menus:XML;
         
         [Bindable]
         [Embed("open.gif")]
         public var openicon:Class;
          [Bindable]
          [Embed("close.gif")]
         public var closeicon:Class;
          [Bindable]
          [Embed("leaf.gif")]
         public var leaficon:Class;
         
         private var myContextMenu:ContextMenu = new ContextMenu();
         
         private function init():void
		 {
		 	// this.strUrl = this.parameters.url;
		 	 //设置了可编辑树再初始化右键菜单
		 	// if(this.parameters.edit == "true")
		 	 //{
		 	 	this.initContextMenu();
		 	// }
		 	 this.tree1.contextMenu = myContextMenu;
		 }
         
         private function initContextMenu():void
         {
         	myContextMenu.hideBuiltInItems();
         	var add:ContextMenuItem = new ContextMenuItem("添加");
         	var rename:ContextMenuItem = new ContextMenuItem("重命名");
         	var remove:ContextMenuItem = new ContextMenuItem("删除");
         	myContextMenu.customItems.push(add);
         	myContextMenu.customItems.push(rename);
         	myContextMenu.customItems.push(remove);
         	
         	add.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,function():void
         	{
         		//可以对弹出的子窗口进行操作
                 var win:window = showAlertWindow();
         	});
         	//删除节点事件
         	remove.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,function():void
         	{
         	    tree1.dataDescriptor.removeChildAt(
				tree1.selectedItem.parent(),
				tree1.selectedItem,
				tree1.selectedItem.childIndex(),
				tree1.dataProvider
				);
         	});
         }
         
         private function showAlertWindow():window
         {
         	//window是自定义组件window.mxml
             var myPanel:window = window(PopUpManager.createPopUp(this, window, true)); // 这里第三个参数 true 表示: 弹出myPanel窗口后, 是否可以对父级操作, 值为true时, 就会产生背景模糊的效果, 并不能对父级的东西进行操作
             return myPanel;
           }
         
         private function LoadMenu(event:ResultEvent):void
         {
             menus = XML(event.result);
             var results:XMLList = menus.node;
             tree1.dataProvider = results;
         }
		 //菜单图标设置
         private function treeIcon(item:Object):Class
         {
         	
              var node:XML = XML(item);
              trace('icon:' + node.@icon);
              var str : String = node.@icon;
              //已经设置图标
              if(node.hasOwnProperty("@icon"))
              {
	              if(node.@icon == 'openicon')
	              {
	              	  return openicon;
	              }
	              if(node.@icon == 'closeicon')
	              {
	              	  return closeicon;
	              }
	              if(node.@icon == 'leaficon')
	              {
	              	  return leaficon;
	              }
              }
              else
              {
				//如果没定义icon就直接用默认的               		
              	if(!tree1.dataDescriptor.isBranch(item))
              	{
			          return tree1.getStyle("defaultLeafIcon");
			    }
			    if(tree1.isItemOpen(item))
			    {
			          return tree1.getStyle("folderOpenIcon");
			    }
			    else
			    {
			        return tree1.getStyle("folderClosedIcon");
			    }
              }
              return null;
        }
        
         /**
         * 菜单树单项点击事件
         * */
         private function itemClickHandler(evt:ListEvent):void
		   {
				var item:Object = Tree(evt.currentTarget).selectedItem;
				if (tree1.dataDescriptor.isBranch(item)) 
				{
				   //tree1.expandItem(item, !groupTree.isItemOpen(item), true);
		        }
		        else
		        {
					//得到节点对象
					var node:XML = XML(item);
					//如果有属性href
					if(node.hasOwnProperty("@href") && node.hasOwnProperty("@target"))
					{
						openURL(node.@href,node.@target);
					}
					if(node.hasOwnProperty("@href") && (node.hasOwnProperty("@target") == false))
					{
						//没有指定target默认在新窗口中打开
						openURL(node.@href,"_blank");
					}
		        }
          }
         	
         //页面跳转的方法 
          private function openURL(url:String ,target:String):void
          {
			 var request:URLRequest = new URLRequest(url); 
			 navigateToURL(request,target);
          }
    ]]>
</mx:Script>
    <mx:HTTPService url="{strUrl}" id="menu" useProxy="false" 
         showBusyCursor="true" result="LoadMenu(event)" resultFormat="xml"/>
    <mx:Tree iconFunction="treeIcon" id="tree1" width="100%" height="100%" labelField="@label"  itemClick="itemClickHandler(event)"/>
</mx:Application>

可以正常显示
3.就是将先有的数据库内容生成xml文件了;
我上传了工程 可以下载看看;
2
0
分享到:
评论

相关推荐

    数字大写的flex实现

    在这个示例中,`toChineseUpper`函数接收一个无符号整数`num`,并使用`CHINESE_DIGITS`字符串和`CHINESE_UNITS`数组进行转换。通过循环处理不同位数,逐个转换并拼接成最终的中文大写数字。 总结一下,实现Flex中的...

    flex做的电子书

    标题中的“flex做的电子书”意味着这可能是一个使用Flex技术开发的交互式电子阅读体验。电子书作为一种多媒体、互动性的阅读方式,Flex的灵活性和强大的图形渲染能力使其成为理想的开发工具。通过Flex,开发者可以...

    flex做词法分析器

    Flex(Fast Lexical Analyzer Generator)是一个用于生成词法分析器的工具,它能根据用户提供的规则自动生成C代码,用于识别文本中的单词,并将这些单词的类别和值输出。 在本实验中,词法分析器的设计与实现目标是...

    Flex数字时钟

    Flex是一个开源的开发工具,主要用于构建富互联网应用程序(RIA),它使用MXML和ActionScript两种语言进行编程。 1. **Flex框架**:Flex是一个用于构建跨平台的、基于Flash技术的用户界面的开放源代码框架。它允许...

    flex写的计算器

    总的来说,“flex写的计算器”是一个展示Flex技术和ActionScript 3.0能力的实例,它结合了MXML和ActionScript来实现一个直观易用的图形界面计算器。开发者通过理解组件模型、事件处理机制以及面向对象的编程概念,...

    flex 弹性布局,最后一行数量不足一行 列表项目左对齐的解决办法

    flex 弹性布局,最后一行数量不足一行 列表项目左对齐的解决办法,经过实际测试,亲自有效,一行的数量可以随意设置。非常有用!

    用flex自动生成词法分析器

    本教程将深入讲解如何使用Flex来创建一个词法分析器,并结合提供的资源进行实践。 首先,让我们理解Flex的工作原理。Flex接受一种特定的描述语言,即.l(lex)文件,其中定义了各种正则表达式来匹配源代码中的模式...

    利用FLEX设计一个small c的词法分析器(文档+工具+源码)

    总之,"利用FLEX设计一个small c的词法分析器"项目是一个极好的实践练习,它涵盖了编程语言处理的基础,包括正则表达式、词法分析原理、FLEX工具的使用,以及实际的编程和调试技能。通过这个项目,你可以深入理解...

    编译原理flex工具包

    在编译原理课程中,Flex通常结合 Bison(语法分析器生成器)一起使用,形成一个完整的解析器。Bison负责处理语法规则,而Flex负责处理词法规则。这种组合可以快速地构建出复杂的解析器,适用于各种编程语言和脚本的...

    17个典型的Flex应用案例介绍

    10. **Bamboo Dock Winner**:这个应用是一个桌面管理工具,使用Flex构建的直观界面,帮助用户组织和访问他们的数字内容,提高了工作和生活效率。 通过以上案例,我们可以看到Flex在出版、文档处理、教育、娱乐、...

    flex-2.5.37.tar.gz

    编译该文件使用`flex lexer.l`,这会生成一个`lexer.c`文件,然后用`cc -o lexer lexer.c`编译为可执行程序。运行生成的程序,它会读取标准输入并根据规则进行处理。 Flex广泛应用于各种解析任务,比如编写编译器、...

    flex 和bison linux 下的软件

    例如,你可以创建一个简单的计算器项目,定义词法规则(如数字、运算符等)和语法规则(如表达式的计算),然后用flex生成词法分析器,用bison生成语法分析器。这两个工具结合使用,可以帮助开发者快速实现复杂语言...

    flex简单时钟制作(flex学习)

    在本文中,我们将深入探讨如何使用Adobe Flex技术创建一个简单的时钟应用。Flex是一种基于ActionScript 3(AS3)的开源框架,主要用于构建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据绑定机制...

    Flex与Bison使用教程

    整个Flex和Bison工具的使用,实际上是编译原理中的一个复杂主题,涉及到编译器的多个阶段,包括词法分析、语法分析、语义分析、中间代码生成、优化以及目标代码生成。掌握Flex和Bison的使用,对于深入理解编译器的...

    Flex纯LCD 数字显示

    总的来说,Flex纯LCD数字显示是当前显示技术的一个重要分支,它的技术进步和创新将持续推动电子产品设计的多样化和用户体验的提升。随着科技的发展,我们可以期待更加灵活、智能和高效的显示解决方案出现在我们日常...

    flex css 模版经典

    Flex CSS 模板经典是网页布局设计中的一个重要概念,它为开发者提供了强大的工具来构建响应式、灵活且可自适应的网页布局。Flexbox( Flexible Box 或 Flex 布局)是CSS3的一个模块,旨在解决传统布局模式在处理动态...

    系统软件开发 Flex实验1

    这个“系统软件开发 Flex实验1”是针对学生或开发者的一个实践项目,旨在通过Flex来设计一个程序,该程序能统计文本文件中的字符数、单词数和行数。这一任务涉及到了软件工程中的编译原理和技术,尤其是词法分析阶段...

    flex 代码格式化

    Flex代码格式化是一种针对使用Adobe Flex框架开发的ActionScript和MXML代码进行美化和整理的过程。Flex是一款强大的开源SDK,用于构建富互联网应用程序(RIA),它允许开发者使用MXML和ActionScript来创建交互式、...

    flex用到JMS代码下载

    压缩包中的FlexBlazedsJMSDemo可能是一个示例项目,展示了如何在Flex应用中使用BlazeDS与JMS服务进行交互。此项目可能包括了Flex前端的源代码以及配置文件,展示了如何创建消息生产者(发布消息)和消费者(订阅并...

Global site tag (gtag.js) - Google Analytics