Tree控件是一个枝和叶节点分层次的机构。树中没每一个条目叫做节点,节点既可以作为枝也可以作为叶。枝节点可以包含叶或枝节点,或者为空。一个叶节点就是一个树的末梢。本快速指南包含一些开发者在使用Treecontrols经常会遇到的一些挑战。
使用XMLLISTCOLLECTION 和ARRAYCOLLECTION对象的对比。
你也许想知道,在运行时从远程或本地得来的数据被动态修改的时候,应该使用XMLListCollection对象还是ArrayCollection对象作为Tree空间的数据提供者。
如果你使用的数据源提供成形的XML,并且,你想在Tree控件中操作 XML数据。你应该使用XMLListCollection对象作为数据提供者。当使用MXML标记时,如果数据源是XMLList对象,你应该把它绑定到XMLLsitCollection对象的source属性上,然后把 XMLListCollection对象绑定到Tree控件的dataProvider属性上。
当你想要动态改变对象值时,不要使用XMLList或XML对象直接绑定到Tree控件的dataProvider属性上。当数据源是RPC(远程过程调用)服务的lastResult属性,并且你想使用XML数据,确保RPC组件的resultFormat属性被设置成e4x,当你使用e4x结果格式,最总结果就是XMLList,可以绑定在XMLListCollection对象上。
这里有一个例子。为例数据被动态改变,使用ArrayCollection对象作为Tree控件的数据提供器。当使用MXML标记时,如果你期望动态的改变Arrayl,你不应该把Array对象直接绑定到Tree控件的dataProvider属性上。作为代替,你应该绑定Array到一个ArrayCollection对象的source属性上,然后再把ArrayCollection对象绑定到Tree控件的dataProvider属性上。
当数据源是RPC(远程过程调用)服务的lastResult对象,并且RPC组件的resultFormat属性被成object,你应该使用ArrayUtil.toArray()方法来确保对象是一个Array。然后绑定到ArrayCollection对象上,就像下边的例子所示:
- <mx:ArrayCollection
- id="employeeAC"
- source="{ArrayUtil.toArray(employeeSrv.lastResult.employees.employee)}"/>
在运行时增加和删除叶子节点
你可以在运行时为Tree控件增加或删除叶子节点。下边的例子包含的代码来实现这种改变。这个程序使用预定义的枝和叶来初始化,表现公司部门和员工。你可以向任意枝节点增加叶节点在运行时。你也可以删除预定义的叶节点和你在运行时增加的节点。
在这个例子中的XML包含两种不同的元素名字,department和employee。Tree控件的label函数,决定根据元素的类型应该显示那些文本。它使用了E4X语法来返回department的title,或者employee的name。然后,这些语法在addEmployee()和removeEmployee()中会用到。
为了增加员工到业务部门,addEmployee()方法使用E4X语法,通过title属性的值获得业务部门的节点,并把它保存到XMLList类型的变量dept中。然后,通过调用dept.appendChild()方法向操作节点添加子结点。remove方法保存当前被选择的元素到变量node中,node的类型是XML。调用node.localName()方法确定被选择的元素是否是employee节点。如果是employee节点,删除它。
例子
- <?xmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"viewSourceURL="src/index.html">
- <mx:Script>
- <![CDATA[importmx.collections.XMLListCollection;
- [Bindable]
- privatevarcompany:XML=
- <list>
- <departmenttitle="Finance"code="200">
- <employeename="JohnH"/>
- <employeename="SamK"/>
- </department>
- <departmenttitle="Operations"code="400">
- <employeename="BillC"/>
- <employeename="JillW"/>
- </department>
- <departmenttitle="Engineering"code="300">
- <employeename="ErinM"/>
- <employeename="AnnB"/>
- </department>
- </list>;
- [Bindable]
- privatevarcompanyData:XMLListCollection=newXMLListCollection(company.department);
- privatefunctiontreeLabel(item:Object):String
- {
- varnode:XML=XML(item);
- if(node.localName()=="department")
- returnnode.@title;
- else
- returnnode.@name;
- }
- privatefunctionaddEmployee():void
- {
- varnewNode:XML=<employee/>;
- newNode.@name=empName.text;
- vardept:XMLList=company.department.(@title=="Operations");
- if(dept.length()>0){
- dept[0].appendChild(newNode);
- empName.text="";
- }
- }
- privatefunctionremoveEmployee():void
- {
- varnode:XML=XML(tree.selectedItem);
- if(node==null)return;
- if(node.localName()!="employee")return;
- varchildren:XMLList=XMLList(node.parent()).children();
- for(vari:Number=0;i<children.length();i++){
- if(children[i].@name==node.@name){
- deletechildren[i];
- }
- }
- }
- ]]>
- </mx:Script>
- <mx:Treeid="tree"top="72"left="50"dataProvider="{companyData}"
- labelFunction="treeLabel"
- height="224"width="179"/>
- <mx:HBox>
- <mx:Buttonlabel="AddOperationsEmployee"click="addEmployee()"/><mx:TextInputid="empName"/>
- </mx:HBox>
- <mx:Buttonlabel="RemoveSelectedEmployee"click="removeEmployee()"/>
- </mx:Application>
提示:可以通过右键flash查看官方源文件
在运行时添加一个空的枝节点
可以在运行时向Tree控件添加空的枝节点。下边的例子展示了通过数据提供器(data provider)API和数据描述器(data descriptor )API添加枝节点。通常,添加枝节点的首选途径是通过数据提供器(data provider)API。
addEmptyBranthDP()方法通过数据提供器API向使用XML数据提供器的Tree组件增加一个空节点,这个方法为新节点创建一个XML类型的变量,并且设置这个节点的isBranch属性为true来创建一个枝节点。然后这个方法调用Tree控件的dataProvider.addItemAt()方法来向Tree控件的数据提供器增加新的元素。
addEmptyBranchDP2()方法通过数据提供器API向使用对象数据提供器的Tree组件增加一个空节点,这个方法使用children属性创建一个新的对象,使用children属性能够确保isBranch()方法返回true。然后,这个方法调用Tree控件的dataProvider.addItemAt()方法来向Tree控件的数据提供器增加新的对象。
addEmptyBranchDD()方法通过数据描述器(data descripter)API。这个方法创建一个XML类型的变量,并且设置isBranch属性为true来创建一个枝节点。然后,这个方法调用Tree控件的dataDescriptor.addChildAt()方法来向Tree控件的数据描述器添加一个新的子节点。
例子
- <?xmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"viewSourceURL="src/index.html"><mx:Script>
- <![CDATA[
- [Bindable]
- privatevardataX:XML=
- <itemlabel="Top">
- <itemlabel="ChildOne"/>
- <itemlabel="ChildTwo"/>
- </item>;
- [Bindable]
- privatevardataObj:Object=
- [{label:"Top",children:
- [
- {label:"ChildOne"},{label:"ChildTwo"}
- ]
- }];
- //AddingabranchbygoingthroughtheTreecontrol'sdataProvider.Thisis
- //thepreferredmethod.
- //TogglingtheisBranchattributetotruecausesDefaultDataDescriptor.isBranch()
- //toreturntrueandtheTreetreatsthenodeasabranch.
- privatefunctionaddEmptyBranchDP():void
- {
- varnewNode:XML=<itemlabel='Middle'isBranch="true"></item>;
- xmlBound2Tree.dataProvider.addItemAt(newNode,1);
- }
- //Foranobjectgraph,thekeypointisthatthechildrenpropertyneedstobedefined,
- //evenifitisempty.
- //ThiscausesisBranch()toreturntrueandtheTreetreatsthenewnodeasabranch.
- privatefunctionaddEmptyBranchDP2():void
- {
- varnewObj:Object={label:"Middle",children:[]};
- objGraphBound2Tree.dataProvider.addItemAt(newObj,1);
- }
- //AddingabranchbygoingthroughtheTreecontrol'sdataDescriptor.
- privatefunctionaddEmptyBranchDD():void
- {
- varnewNode:XML=<itemlabel='Child4'isBranch="true"></item>;
- xmlBound2Tree.dataDescriptor.addChildAt(dataX,newNode,2,dataX);
- }
- ]]>
- </mx:Script>
- <mx:Labeltext="TreewithXMLdata"/>
- <mx:Treeid="xmlBound2Tree"dataProvider="{dataX}"labelField="@label"showRoot="true"width="200"/>
- <mx:Buttonlabel="AddEmptyBranchthroughthedataProvider"click="addEmptyBranchDP();"/>
- <mx:Buttonlabel="AddEmptyBranchthroughthedataDescriptor"click="addEmptyBranchDD();"/>
- <mx:Spacerheight="10"/>
- <mx:Labeltext="Treewithobjectdata"/>
- <mx:Treeid="objGraphBound2Tree"dataProvider="{dataObj}"width="200"/>
- <mx:Buttonlabel="AddEmptyBranchthroughthedataProvider"click="addEmptyBranchDP2();"/>
- </mx:Application>
结果
打开树到指定的节点
默认的,Tree控件在初始化后是收缩的,你也许不确定如何初始化控件时展开数,并且选定指定的节点。下边的例子,展示了如何实现它。在这个程序中,initTree()方法,在Tree控件被创建后调用。这个方法展开Tree控件的根节点,并且设置selectedIndex属性为指定节点的索引号。
- <?xmlversion="1.0"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"viewSourceURL="src/index.html"><mx:Script>
- <![CDATA[
- importFlash.events.*;
- importmx.events.*;
- importmx.controls.*;
- privatefunctioninitTree():void{
- XMLTree1.expandItem(MailBox.getItemAt(0),true);
- XMLTree1.selectedIndex=2;
- }
- ]]>
- </mx:Script>
- <mx:Treeid="XMLTree1"width="150"height="170"
- labelField="@label"creationComplete="initTree();">
- <mx:XMLListCollectionid="MailBox">
- <mx:XMLList>
- <nodelabel="Mail"data="100">
- <nodelabel="Inbox"data="70"/>
- <nodelabel="PersonalFolder"data="10">
- <nodelabel="Business"data="2"/>
- <nodelabel="Demo"data="3"/>
- <nodelabel="SavedMail"data="5"/>
- </node>
- <nodelabel="Sent"data="15"/>
- <nodelabel="Trash"data="5"/>
- </node>
- </mx:XMLList>
- </mx:XMLListCollection>
- </mx:Tree>
- </mx:Application>
结果
读取多节点名XML文档
你可以从具有多个节点名字的XML文档中组装Tree 控件。下边的例子实现了这个功能。Tree控件的数据提供者是一个XMLListCollection,它组装自一个包含folder和Pfolder元素的XMLList。Tree控件的labelField属性被设置为label属性,不管元素叫什么名字,这个属性对XMLList中的所有属性都是公共的。
例子
结果
- <?xmlversion="1.0"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"viewSourceURL="src/index.html">
- <mx:Treeid="tree1"dataProvider="{MailBox}"labelField="@label"showRoot="true"width="160"/>
- <mx:XMLListCollectionid="MailBox"source="{Folders}"/>
- <mx:XMLListid="Folders">
- <folderlabel="Mail">
- <folderlabel="INBOX"/>
- <folderlabel="PersonalFolder">
- <Pfolderlabel="Business"/>
- <Pfolderlabel="Demo"/>
- <Pfolderlabel="SavedMail"/>
- </folder>
- <folderlabel="Sent"/>
- <folderlabel="Trash"/>
- </folder>
- </mx:XMLList>
- </mx:Application>
当数据提供器更新时保持Tree控件打开
默认地,当数据提供器更新数据时Tree控件收缩。下边的例子展示了当数据提供器更新时保持Tree控件打开的方法。
在这个应用程序中,当一个用户单击Button控件时changeProvider()方法更新数据提供器。通常,这会导致Tree控件收缩。然而,Tree控件的渲染事件处理器,renderTree()方法,放置收缩的发生。当changerProvider()方法被调用,当前状态是打开的元素被保存到对象open变量中。当数据被刷新时,被命名为refreshData的Boolean类型的变量被置为true。renderTree()方法调用Tree控件的invalidateList()方法来刷新树的行。然后置refreshDate属性为false,并且重置Tree控件的打开元素属性为open对象变量,这个变量在刷新前就包含了状态是打开的元素。
例子
结果
- <?xmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="vertical"initialize="initTree()"viewSourceURL="srcview/index.html">
- <mx:Script>
- <![CDATA[
- [Bindable]
- publicvaropen:Object=newObject();
- [Bindable]
- publicvarrefreshData:Boolean=false;
- [Bindable]
- publicvarswitchObj:Object=newObject();
- [Bindable]
- publicvarfirstObj:Object=newObject();
- [Bindable]
- publicvarfirstObj1:Object=newObject();
- [Bindable]
- publicvarfirstObj2:Object=newObject();
- [Bindable]
- publicvarprovider:String="firstObj";
- privatefunctioninitTree():void
- {
- firstObj=newObject();
- firstObj.label="Foods";
- firstObj.children=newArray();
- firstObj1.label="Fruits";
- firstObj1.children=newArray();
- firstObj2.label="Oranges";
- firstObj1.children[0]=firstObj2;
- firstObj.children[0]=firstObj1;
- switchObj=firstObj;
- }
- publicfunctionchangeProvider():void
- {
- open=SampleTree.openItems;
- refreshData=true;
- if(provider=="firstObj")
- {
- provider="switchObj";
- SampleTree.dataProvider=switchObj;
- }
- else
- {
- provider="firstObj";
- SampleTree.dataProvider=firstObj;
- }
- }
- publicfunctionrenderTree():void{
- if(refreshData){
- //Refreshallrowsonnextupdate.
- SampleTree.invalidateList();
- refreshData=false;
- SampleTree.openItems=open;
- //Validateandupdatethepropertiesandlayout
- //ofthisobjectandredrawit,ifnecessary.
- SampleTree.validateNow();
- }
- }
- ]]>
- </mx:Script>
- <mx:Treeid="SampleTree"render="renderTree()"width="250"dataProvider="{firstObj}"labelField="label"/>
- <mx:Buttonlabel="ChangeDataProvider"click="changeProvider()"/>
- </mx:Application>
项和一个树控件拖放
拖拽元素到Tree控件,和从Tree控件拖拽出元素创建一个应用程序,实现拖拽元素从Tree控件中,或到Tree控件是令人畏惧的,很明显,因为需要大量的事件处理逻辑。本节提供2个例子,来示范实现这2种功能的技术。从Tree控件中拖拽出元素下边的例子展示如何从Tree控件中拖拽元素到DataGrid控件中。Tree控件的数据提供器是XML对象。通过拖拽事件处理方法前的注释可以使你读懂整个应用程序。
例子
- <?xmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute">
- <mx:Script>
- <![CDATA[
- importmx.controls.Alert;
- importmx.controls.Label;
- importmx.controls.List;
- importmx.collections.ArrayCollection;
- importmx.core.DragSource;
- importmx.controls.Tree;
- importmx.controls.DataGrid;
- importmx.controls.listClasses.ListBase;
- importmx.events.DragEvent;
- importmx.containers.Canvas;
- importmx.managers.DragManager;
- importmx.core.UIComponent;
- [Bindable]
- privatevardataGridProvider:ArrayCollection=newArrayCollection();
- /**
- *HandlesthedragEntereventontheDataGridcontrol.
- *IfthedragInitiatoristheTreecontrol,thenonlynodesoftype"restaurant"
- *arepermittedtobedropped.
- *HereyoucanseethatbyexaminingthedragSourceyoucandetermineif
- *thecontrolshouldacceptthedrop.TheDataGridcontrolwouldnot
- *knowhowtotreatabranch+childrenfromtheTreecontrol,soonlyleaf(restaurant)
- *nodesareaccepted.
- */
- privatefunctiononDragEnter(event:DragEvent):void
- {
- if(event.dragInitiatorisTree){
- vards:DragSource=event.dragSource;
- if(!ds.hasFormat("treeItems"))return;//nousefuldata
- varitems:Array=ds.dataForFormat("treeItems")asArray;
- for(vari:Number=0;i<items.length;i++){
- varitem:XML=XML(items[i]);
- if(item.@type!="restaurant")return;//notwhatwewant
- }
- }
- //IftheTreecontrolpassesorthedragInitiatorisnotaTreecontrol,
- //acceptthedrop.
- DragManager.acceptDragDrop(UIComponent(event.currentTarget));
- }
- /**
- *HandlesthedragOvereventontheDataGridcontrol.
- *IfthedragInitiatoristheTreecontrol,onlycopyisallowed.Otherwise,amove
- *orlinkcantakeplacefromtheListcontrol.
- */
- privatefunctiononDragOver(event:DragEvent):void
- {
- if(event.dragInitiatorisTree){
- DragManager.showFeedback(DragManager.COPY);
- }else{
- if(event.ctrlKey)
- DragManager.showFeedback(DragManager.COPY);
- elseif(event.shiftKey)
- DragManager.showFeedback(DragManager.LINK);
- else{
- DragManager.showFeedback(DragManager.MOVE);
- }
- }
- }
- /**
- *HandlesthedragExiteventonthedroptargetandjusthidesthe
- *thedropfeedback.
- */
- privatefunctiononDragExit(event:DragEvent):void
- {
- vardropTarget:ListBase=ListBase(event.currentTarget);
- dropTarget.hideDropFeedback(event);
- }
- /**
- *HandlesthedragDropeventontheDataGridwhenthe
- *dragproxyisreleased.
- */
- privatefunctiononGridDragDrop(event:DragEvent):void
- {
- vards:DragSource=event.dragSource;
- vardropTarget:DataGrid=DataGrid(event.currentTarget);
- vararr:Array;
- if(ds.hasFormat("items")){
- arr=ds.dataForFormat("items")asArray;
- }elseif(ds.hasFormat("treeItems")){
- arr=ds.dataForFormat("treeItems")asArray;
- }
- for(vari:Number=0;i<arr.length;i++){
- varnode:XML=XML(arr[i]);
- varitem:Object=newObject();
- item.label=node.@label;
- item.type=node.@type;
- dataGridProvider.addItem(item);
- }
- onDragExit(event);
- }
- /**
- *InterceptsthedragCompleteeventontheTreecontrol
- *andpreventsthedefaultbehaviorfromhappening.Thisisnecessary
- *iftheitembeingdraggedfromtheTreecontrolisdroppedonanon-Tree
- *object,suchastheDataGrid.
- */
- privatefunctiononTreeDragComplete(event:DragEvent):void{
- event.preventDefault();
- }
- /**
- *SelectsalloftheitemsintheListifCtrl+AispickedwhentheListcontrol
- *hasfocus.
- */
- privatefunctionselectAllMaybe(event:KeyboardEvent):void
- {
- if(event.ctrlKey&&event.keyCode==65){
- varl:List=List(event.currentTarget);
- varallItems:Array=newArray(l.dataProvider.length);
- for(vari:Number=0;i<allItems.length;i++){
- allItems[i]=i;
- }
- l.selectedIndices=allItems;
- }
- }
- ]]>
- </mx:Script>
- <mx:XMLid="treeData"xmlns="">
- <root>
- <nodelabel="Massachusetts"type="state"data="MA">
- <nodelabel="Boston"type="city">
- <nodelabel="SmokeHouseGrill"type="restaurant"/>
- <nodelabel="Equator"type="restaurant"/>
- <nodelabel="Aquataine"type="restaurant"/>
- <nodelabel="Grill23"type="restaurant"/>
- </node>
- <nodelabel="Provincetown"type="city">
- <nodelabel="LobsterPot"type="restaurant"/>
- <nodelabel="TheMews"type="restaurant"/>
- </node>
- </node>
- <nodelabel="California"type="state"data="CA">
- <nodelabel="SanFrancisco"type="city">
- <nodelabel="FrogLane"type="restaurant"/>
- </node>
- </node>
- </root>
- </mx:XML>
- <mx:Labelx="34"y="40"text="DragitemsfromthisTree"/>
- <mx:Labelx="34"y="55"text="(itemsarecopied)"/>
- <mx:Treex="34"y="81"width="181"height="189"
- dataProvider="{treeData.node}"
- labelField="@label"
- dropEnabled="false"
- dragEnabled="true"
- dragComplete="onTreeDragComplete(event)"
- dragMoveEnabled="false"
- />
- <mx:Labelx="291"y="55"text="DropitemsfromTreehere"/>
- <mx:DataGridx="291"y="81"height="189"
- dragEnabled="true"
- dataProvider="{dataGridProvider}"
- dragEnter="onDragEnter(event)"
- dragOver="onDragOver(event)"
- dragDrop="onGridDragDrop(event)"
- dragExit="onDragExit(event)">
- <mx:columns>
- <mx:DataGridColumnheaderText="Label"dataField="label"/>
- <mx:DataGridColumnheaderText="Type"dataField="type"/>
- </mx:columns>
- </mx:DataGrid>
- </mx:Application>
树控件拖放
下面的示例演示如何将项从列表控件拖到树控件。 树数据提供程序是XML对象。
例子
结果
- <?xmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute">
- <mx:Script>
- <![CDATA[
- importmx.events.DragEvent;
- importmx.managers.DragManager;
- importmx.core.DragSource;
- importmx.core.UIComponent;
- importmx.controls.Tree;
- /**
- *CalledassoonasthedragProxyentersthetarget.Youcanaddlogic
- *todetermineifthetargetwillacceptthedropbasedonthe
- *dragInitiator,thedataavailableinthedragSource.
- *Herethedropisblindlyaccepted.
- */
- privatefunctiononDragEnter(event:DragEvent):void
- {
- DragManager.acceptDragDrop(UIComponent(event.currentTarget));
- }
- /**
- *CalledwhilethedragProxyisoverthedroptarget.Youcan
- *usethisfunctiontodeterminethetypeoffeedbacktoshow.
- *SincetheListissettoallowMOVE(theitemisdeleted
- *oncedropped),differentfeedbackpossibilitiesaregiven.
- *
- *Also,forthisapplication,theTreecontrolnodethedragProxyis
- *overisselected.AsthedragProxymoves,theTreecontrol's
- *selectionchanges.
- *
- *Forabitmorecomplication,thedropisbeingallowed
- *onlyovernodeswhosetypeisNOT'state'.
- *Thefeedbackisremoved.
- */
- privatefunctiononDragOver(event:DragEvent):void
- {
- vardropTarget:Tree=Tree(event.currentTarget);
- varr:int=dropTarget.calculateDropIndex(event);
- tree.selectedIndex=r;
- varnode:XML=tree.selectedItemasXML;
- if(node.@type=="state"){
- DragManager.showFeedback(DragManager.NONE);
- return;
- }
- if(event.ctrlKey)
- DragManager.showFeedback(DragManager.COPY);
- elseif(event.shiftKey)
- DragManager.showFeedback(DragManager.LINK);
- else{
- DragManager.showFeedback(DragManager.MOVE);
- }
- }
- /**
- *CalledwhenthedragProxyisreleased
- *overthedroptarget.TheinformationinthedragSource
- *isextractedandprocessed.
- *
- *Thetargetnodeisdeterminedand
- *allofthedataselected(theListhasallowMultipleSection
- *set)isadded.
- */
- privatefunctiononDragDrop(event:DragEvent):void
- {
- vards:DragSource=event.dragSource;
- vardropTarget:Tree=Tree(event.currentTarget);
- varitems:Array=ds.dataForFormat("items")asArray;
- varr:int=tree.calculateDropIndex(event);
- tree.selectedIndex=r;
- varnode:XML=tree.selectedItemasXML;
- varp:*;
- //iftheselectednodehaschildren(itistype==city),
- //thenaddtheitemsatthebeginning
- if(tree.dataDescriptor.hasChildren(node)){
- p=node;
- r=0;
- }else{
- p=node.parent();
- }
- for(vari:Number=0;i<items.length;i++){
- varinsert:XML=<node/>;
- insert.@label=items[i];
- insert.@type="restaurant";
- tree.dataDescriptor.addChildAt(p,insert,r+i);
- }
- }
- /**
- *Calledwhenthedragoperationcompletes,whether
- *successfullyornot.Thetreeisclearedofits
- *selection.
- */
- privatefunctiononDragComplete(event:DragEvent):void
- {
- tree.selectedIndex=-1;
- }
- ]]>
- </mx:Script>
- <mx:XMLid="treeData"xmlns="">
- <root>
- <nodelabel="Massachusetts"type="state"data="MA">
- <nodelabel="Boston"type="city">
- <nodelabel="SmokeHouseGrill"type="restaurant"/>
- <nodelabel="Equator"type="restaurant"/>
- <nodelabel="Aquataine"type="restaurant"/>
- <nodelabel="Grill23"type="restaurant"/>
- </node>
- <nodelabel="Provincetown"type="city">
- <nodelabel="LobsterPot"type="restaurant"/>
- <nodelabel="TheMews"type="restaurant"/>
- </node>
- </node>
- <nodelabel="California"type="state"data="CA">
- <nodelabel="SanFrancisco"type="city">
- <nodelabel="FrogLane"type="restaurant"/>
- </node>
- </node>
- </root>
- </mx:XML>
- <mx:Arrayid="listData">
- <mx:String>JohnnyRocket's</mx:String>
- <mx:String>JetPizza</mx:String>
- <mx:String>Steve'sGreek</mx:String>
- <mx:String>Sonsie</mx:String>
- <mx:String>TheBorderCafe</mx:String>
- </mx:Array>
- <mx:Panelx="48"y="125"width="447"height="351"layout="absolute"title="DragontoTree">
- <mx:Treewidth="186"left="10"top="10"bottom="10"id="tree"
- labelField="@label"
- dataProvider="{treeData.node}"
- dropEnabled="false"
- dragMoveEnabled="false"
- dragEnter="onDragEnter(event)"
- dragOver="onDragOver(event)"
- dragDrop="onDragDrop(event)">
- </mx:Tree>
- <mx:Listwidth="188"height="206"right="10"bottom="10"id="list"
- allowMultipleSelection="true"
- dataProvider="{listData}"
- dragEnabled="true"
- dragMoveEnabled="true"
- dragComplete="onDragComplete(event)">
- </mx:List>
- <mx:Textx="229"y="10"text="Dragfromthelistbelowtothetree"width="188"height="39"/>
- <mx:Labelx="229"y="69"text="restaurants"/>
- </mx:Panel>
- </mx:Application>