FLEX-ComboBox绑定JAVA返回的数据源(RemoteObject)
万万没有想到会在一个小小的ComboBox上碰这么大钉子,整整弄了一天才摸索出来使用RemoteObject将JAVA返回的数据(包含HashMap的List)绑定在FLEX ComboBox上的方法……
场景:底层通过JAVA从数据库中取出Authority中的职位信息(rid: 职位ID,rname:职位名称),将其存入HashMap中,并将HashMap全部存入一个List返回给Flex,并绑定在ComboBox上。
FLEX Display组件:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>?
?
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="712" height="563" showCloseButton="true" title="新建用户" x="288" y="226" xmlns:ns1="ui.panel.admin.*" initialize="getPos()">?
??? <mx:Script>?
??????? <[CDATA[??
??????????? import mx.collections.ArrayCollection;??
??????????? import mx.controls.List;??
??????????? import mx.rpc.events.ResultEvent;??
??????????? import mx.controls.Alert;??
??????????? [bindable]??
??????????? private var posArray:ArrayCollection = new ArrayCollection();??
??????????????????????????
??????????? function getPos():void{??
??????????????? hasuser.getRoles();??
??????????? }??
??????????????
??????????? function getPosition(event:ResultEvent):void{??
??????????????? posArray = event.result as ArrayCollection;??
??????????????? position.dataProvider = posArray;??
??????????? }??
function close():void{??
??????????????????????????????? trace(""+position.selectedItem.rid);??
??????????????????????? }??
??????? ]]>?
??? </mx:Script>?
??? <mx:RemoteObject id="hasuser" destination="islogin">?
??? <mx:method name="getRoles" result="getPosition(event)"/>?
??? </mx:RemoteObject>?
??????????
??? <mx:ComboBox x="426" y="249" id="position" width="160.75" editable="false" color="#0B333C" fontSize="12" prompt="请选择职位..." fontWeight="bold" labelField="rname" close="close()"></mx:ComboBox>?
</mx:TitleWindow>?
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="712" height="563" showCloseButton="true" title="新建用户" x="288" y="226" xmlns:ns1="ui.panel.admin.*" initialize="getPos()">
?<mx:Script>
??<[CDATA[
???import mx.collections.ArrayCollection;
???import mx.controls.List;
???import mx.rpc.events.ResultEvent;
???import mx.controls.Alert;
???[bindable]
???private var posArray:ArrayCollection = new ArrayCollection();
??????
???function getPos():void{
????hasuser.getRoles();
???}
???
???function getPosition(event:ResultEvent):void{
????posArray = event.result as ArrayCollection;
????position.dataProvider = posArray;
???}
function close():void{
??????????????????????????????? trace(""+position.selectedItem.rid);
??????????????????????? }
??]]>
?</mx:Script>
?<mx:RemoteObject id="hasuser" destination="islogin">
?<mx:method name="getRoles" result="getPosition(event)"/>
?</mx:RemoteObject>
??
?<mx:ComboBox x="426" y="249" id="position" width="160.75" editable="false" color="#0B333C" fontSize="12" prompt="请选择职位..." fontWeight="bold" labelField="rname" close="close()"></mx:ComboBox>
</mx:TitleWindow>
?
其中close()函数是来测试选中项目的值。
RemoteObject配置:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?>?
<service id="remoting-service" />?
??? </adapters>?
?
??? <default-channels>?
??????? <channel ref="my-amf" />?
??? </default-channels>?
?
??? <destination id="islogin">?
??????? <properties>?
??????????? <source>com.pmo.action.RolesAction</source>?
??????? </properties>?
??? </destination>?
?
</service>?
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" />
?</adapters>
?<default-channels>
??<channel ref="my-amf" />
?</default-channels>
?<destination id="islogin">
??<properties>
???<source>com.pmo.action.RolesAction</source>
??</properties>
?</destination>
</service>
取出数据相关代码:
view plaincopy to clipboardprint?
List<Authority> l = q.list();??
??????????
??????? List l2 = null;??
??????? if (l.size()!=0) {??
??????????????
??????????? l2 = new ArrayList();??
??????????? for(int i=0;i<l.size();i++){??
??????????????? HashMap hm = new HashMap();??
??????????????? hm.put("rid",""+((Authority)l.get(i)).getRid());??
??????????????? hm.put("rname",""+((Authority)l.get(i)).getRname());??
??????????????? l2.add(hm);??
??????????? }??
??????? }??
return l2;?
List<Authority> l = q.list();
??
??List l2 = null;
??if (l.size()!=0) {
???
???l2 = new ArrayList();
???for(int i=0;i<l.size();i++){
????HashMap hm = new HashMap();
????hm.put("rid",""+((Authority)l.get(i)).getRid());
????hm.put("rname",""+((Authority)l.get(i)).getRname());
????l2.add(hm);
???}
??}
return l2;
运行结果:
?
这个方法还可以适用于其他Display组件如Tree等。
不过这里有一个小问题,就是当服务器刚刚启动后,打开页面,这时Display组件会执行initialize()方法,读取数据库数据,若读取数据比较多的时候会有滞后性,可能会出现点击ComboBox而出现一片空白的情况,因为FLEX的操作都是异步的,此时数据还没有从JAVA那边传回来(LCDS还是有点慢的……),可以在ComboBox组件中加入showBusyCursor="true"告知用户此时正在读取数据,然后在getPosition()执行时令showBusyCursor="false" 。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/matianyi0307/archive/2009/03/20/4008228.aspx