想用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文件了;
我上传了工程 可以下载看看;