﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-丄諦啲仇魜ヤ              -文章分类-FLEX</title><link>http://www.blogjava.net/Crying/category/39017.html</link><description>如 果 敌 人 让 你 生 气 , 那 说 明 你 没 有 胜 他 的 把 握！ 
</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2009 10:14:35 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2009 10:14:35 GMT</pubDate><ttl>60</ttl><item><title>Flex连接数据库三种方法(http://blog.csdn.net/wirror800/archive/2009/04/07/4053224.aspx)</title><link>http://www.blogjava.net/Crying/articles/265330.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 13 Apr 2009 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/265330.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/265330.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/265330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/265330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/265330.html</trackback:ping><description><![CDATA[<p>首先，做一点说明。Flex是不能直接连接数据库的，这一点大家需要知道，它只能间接地连接数据库。Flex中提供了三种方式：HttpService，WebService 和RemoteObject。其中HttpService可以直接获取XML中的数据，还可以通过JSP,ASP以及PHP读取数据库中的数据，这个比较简单，而且网上也有很多例子，我就不多说了。WebService我不懂，请自己查资料。我一直用的是JAVA对象连接数据库，感觉这个挺方便，而且J2EE的技术已经很成熟。今天的教程就是以 Flex + JAVA + SQLServer获取数据库公告信息为例简单说一下RemoteObject的用法。<br />
前提<br />
1.确保你安装了Flex Data Service。这个对于单个CUP无限APP是免费的，可以去Adobe下载。如果只是读取XML文件是不需要这个的，连接数据库就需要它了。<br />
2.安装了Flex Builder或者有Flex SDK。我这里使用的是Flex Builder（IDE就是方便啊 ^_^）。<br />
3.安装了SQLServer数据库。<br />
4.安装了JRUN或者tomcat或其它的J2EE容器，因为发布的时候我们的程序要运行在J2EE平台上。<br />
5.安装了JDK。<br />
第一步：创建数据库<br />
这里我们有一个公告表，表名为Bulletin。结构如下：<br />
字段名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自动编号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自动编号<br />
title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nvarchar(100)&nbsp;&nbsp;&nbsp;&nbsp;题目<br />
date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datatime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期<br />
author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nvarchar(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者<br />
content&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内容<br />
在数据库中创建这个表。保存之后进入下一步。<br />
第二步：在JAVA中编写获取公告的代码<br />
首先，我们要创建一个公告类来专门保存获取的公告信息，代码如下。<br />
NoticeInfo.java<br />
package net.zhuoqun.connectDB;<br />
import java.util.Date;<br />
public class NoticeInfo {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String title;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 标题<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String author;&nbsp;&nbsp;// 作者<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String content;// 内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Date dates;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 时间&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getAuthor() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return author;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setAuthor(String author) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.author = author;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; // 其它get 和 set 方法。<br />
}<br />
创建好这个之后我们要创建一个数据查询类：DataServiceImpl.java来查询数据库，并将查询结果传给将要创建的Flex程序。由于我们不清楚有多少条记录，所以就借助一下JAVA中的ArrayList这个类，它位于java.util 包中。先创建一个ArrayList：<br />
ArrayList noticeList = new ArrayList();<br />
查询数据库之后，每读取一条记录就添加到 noticeList。<br />
while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;NoticeInfo temp = new NoticeInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;temp.setAuthor(rs.getString("author"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;temp.setContent(rs.getString("content"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;temp.setDates(rs.getDate("date"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;temp.setTitle(rs.getString("title"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;noticeList.add(temp);<br />
}<br />
查询完毕之后你就可以把这个noticeList传回去，你也可以传回去一个 NoticeInfo 数组：<br />
NoticeInfo[] notices = new NoticeInfo[noticeList.size()];<br />
for(int i=0;i&lt;noticeList.size();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;notices = (NoticeInfo)noticeList.get(i);<br />
}<br />
return notices;<br />
我这里用的是后一种方法。如果你直接把noticeList传回去的话，记住一点，JAVA的ArrayList类型的对象到了Flex中会变成ArrayCollection类型的。<br />
现在JAVA部分的代码就写好了。<br />
DataServiceImpl.java 的全部代码如下：<br />
package net.zhuoqun.connectDB;<br />
import java.sql.*;<br />
import java.util.ArrayList;<br />
import java.util.Date;<br />
public class DataServiceImpl {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Connection conn = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Statement stmt = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 以下是数据库以及驱动信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String CONN_STR_PRE = "jdbc:microsoft:sqlserver://";<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String HOST_NAME = "localhost:1433;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String DATABASE_NAME = "DatabaseName=mydata";<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String USERNAME = "aaa";<br />
&nbsp;&nbsp;&nbsp;&nbsp;public final static String PASSWORD = "aaa";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public DataServiceImpl(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 查询数据库<br />
&nbsp;&nbsp;&nbsp;&nbsp;private ResultSet executeQuery(String sqlText){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(DRIVER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(ClassNotFoundException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = DriverManager.getConnection(CONN_STR_PRE + HOST_NAME + DATABASE_NAME, USERNAME, PASSWORD);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = stmt.executeQuery(sqlText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return rs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 查询公告. 这个是本程序的关键代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;public NoticeInfo[] getNotices(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList noticeList = new ArrayList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String sqlText = "select author,content,date,title from Bulletin";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet rs = executeQuery(sqlText);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoticeInfo temp = new NoticeInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.setAuthor(rs.getString("author"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.setContent(rs.getString("content"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.setDates(rs.getDate("date"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.setTitle(rs.getString("title"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;noticeList.add(temp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoticeInfo[] notices = new NoticeInfo[noticeList.size()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;noticeList.size();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notices = (NoticeInfo)noticeList.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return notices;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
第三步： 配置Flex Data Service<br />
1，把刚才写的JAVA文件编译。打开FDS的安装文件夹，将编译的文件拷贝到\jrun4\servers\default\flex\WEB-INF\classes 文件夹中，进行下面的配置。<br />
2.打开FDS的安装文件夹。进入jrun4\servers\default\flex\WEB-INF\flex 目录。里面是关于FlexData Service的配置文件，我们这里只看RemoteObject如何配置，其它配置信息请自己看帮助。现在我们打开里面的remoting-config.xml文件。向里面添加如下信息，作为&lt;service&gt;的子标签：<br />
程序代码<br />
&lt;destination id="dataService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;source&gt;net.zhuoqun.connectDB.DataServiceImpl&lt;/source&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&lt;/destination&gt;<br />
当你设定了 destination的时候，你就引用了了可以用来连接相应类的信息通道（messaging channel）。它的id必须在文件中是独一无二的。source属性是指你编译的JAVA类在classes文件夹中的路径。由于我的DataServiceImpl类在classes\net\zhuoqun\connectDB中，所以source的值为net.zhuoqun.connectDB.DataServiceImpl。记住，不要写.class后缀。&lt;properties&gt;标签还可以有一个&lt;scope&gt;子标签，其作用我在这里就不说了，大家自己看相关文档（关于FDS的配置其实有很多东西，这些在帮助文档里都有，我这里不多说了，也说不过来，自己看吧）。<br />
现在我们已经配置好了后台的 FDS，做完了整个程序的大部分工作，接下来就是前台Flex程序调用的事情了。<br />
第四步：创建Flex程序<br />
打开Flex Builder，新建一个工程 ConnectDB。菜单栏中 File -&gt; New -&gt; Flex Project，这时会弹出一个对话框，选择 Flex Data Service，创建了一个Flex工程。<br />
第五步：通过 RemoteObject 访问数据库<br />
打开工程中生成的主文件 ConnectDB.mxml，声明一个 RemoteObject ：<br />
程序代码<br />
&lt;mx:RemoteObjectid="getData" destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.faultString,'Error')"/&gt;<br />
其中destination 的值是刚才我们在配置 FDS 的时候设定的 destination。 result 表示在这个RemoteObject成功返回之后所要做的动作，这里我们调用一个方法 proccessResult()来处理返回的数据，它的参数 event.result就是从服务器段获得的数据，数据是作为一个对象传过来的。 fault表示在这个RemoteObject请求失败时要做的处理，这里我们会弹出一个显示错误信息的对话框。接下来我们要声明一个DataGrid控件来显示公告的标题和发布日期：<br />
程序代码<br />
&lt;mxataGrid id="myDG"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:columns&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mxataGridColumn headerText="标题" dataField="title"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mxataGridColumn headerText="发布日期" dataField="dates" labelFunction="formatDate"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:columns&gt;<br />
&lt;/mx:DataGrid&gt;<br />
其中headerText是显示在上方的表头，dataField表示要显示的数据域，为什么数据域是title和dates呢？因为我们传回的是一个NoticeInfo 对象数组，虽然它是作为一个对象传回来的，但是其中的数据结构并没有变，那些数据域的名字也没有变，所以我们可以根据NoticeInfo 中的变量设定dataField。labelFunction属性是用来格式化显示的，因为传回来的是格林威治时间，所以我们需要将其格式化然后显示出来。注意，这里只是显示两个数据域，并不代表其它的数据都没有了，它们仍然存在，只是没有显示出来。<br />
接下来，在 &lt;mx:Script&gt; 标签中编写proccessResult()方法和格式化日期的 formatDate方法：<br />
程序代码<br />
private function proccessResult(result:Object):void<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;myDG.dataProvider = ArrayUtil.toArray(result);<br />
}<br />
private function formatDate(item:Object,column:DataGridColumn):String<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return df.format(item.dates);<br />
}&nbsp;&nbsp;&nbsp;&nbsp;// df 是一个 DateFormatter，在下面会给出。关于如何格式化DataGrid的显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 以及DateFormatter这里就不讨论了，帮助里写得很清楚<br />
这个函数只是简单地将获得的数据传给 myDG 的 dataProvider。result的类型是Object，因为数据是作为一个对象传过来的。之所以调用 ArrayUtil.toArray()这个方法，是因为返回的记录可能只有一条，而myDG 的 dataProvider显示单个对象的时候可能会出错，所以安全起见先将其转换成数组。<br />
最后，我们编写调用 RemoteObject 的方法，使其在程序启动时就调用。<br />
程序代码<br />
private function initApp():void<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getData.getNotices();<br />
}<br />
其中 getData 是RemoteObject的id，getNotices()是DataServiceImpl.java中的方法。在这里可以直接调用它。当然，如果DataServiceImpl.java有其它方法，也可以通过这种方式直接调用。接下来设定组件创建完毕时调用 initApp()方法，在&lt;mx:Application&gt;中添加一个creationComplete属性:<br />
程序代码<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml" target="_blank">http://www.adobe.com/2006/mxml</a>" fontSize="12" creationComplete="initApp()"&gt;<br />
ConnectDB.mxml的全部代码：<br />
程序代码<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml" target="_blank">http://www.adobe.com/2006/mxml</a>" fontSize="12" creationComplete="initApp()"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.controls.Alert;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.utils.ArrayUtil;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private function initApp():void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getData.getNotices();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private function proccessResult(result:Object):void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myDG.dataProvider = ArrayUtil.toArray(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private function formatDate(item:Object,column:DataGridColumn):String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return df.format(item.dates);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}// df 是一个 DateFormatter，在下面会给出。关于如何格式化DataGrid的显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 以及DateFormatter这里就不讨论了，帮助里写得很清楚<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:DateFormatter id="df" formatString="YYYY-MM-DD"/&gt;<br />
&nbsp;&nbsp; &lt;mx:RemoteObject id="getData" destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.faultString,'Error')"/&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:DataGrid id="myDG"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:columns&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:DataGridColumn headerText="标题" dataField="title"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:DataGridColumn headerText="发布日期" dataField="dates" labelFunction="formatDate"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:columns&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mx:DataGrid&gt;<br />
&lt;/mx:Application&gt;<br />
整个工程终于完成，启动JRUN，然后运行程序，查看程序结果<br />
如果是其他数据库，只需要改一下数据库驱动信息就可以了</p>
<!--v:2.2-->
<img src ="http://www.blogjava.net/Crying/aggbug/265330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2009-04-13 17:14 <a href="http://www.blogjava.net/Crying/articles/265330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最全的FLEX网站收集(http://yzyzilyr.spaces.live.com/blog/cns!80B5D9AC4E8FA63!421.entry?wa=wsignin1.0&amp;sa=619253831)</title><link>http://www.blogjava.net/Crying/articles/265328.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 13 Apr 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/265328.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/265328.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/265328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/265328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/265328.html</trackback:ping><description><![CDATA[<div>一、国外<span>站点</span> <br />
1.<span>资源</span> 类<br />
<a href="http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html" target="_blank"><span style="color: #0000ff"><span>Adobe</span> <span>Flex</span> 2 Component Explorer</span><font color="#336699"> </font></a>： 官方的，展示了各种<span>组件</span> 的<span>用法</span> ，<span>入门</span> 必看。<br />
<a href="http://www.cflex.net/" target="_blank"><span style="color: #0000ff">CFlex</span><font color="#336699"> </font></a>：很好的一个Flex资源站点，包括<span>教程</span> ，新闻，资源站点&#8230;&#8230; 只是页面有点杂乱，大家一般看右边那一栏就行了。<br />
<a href="http://flexbox.mrinalwadhwa.com/" target="_blank"><span style="color: #0000ff">FlexBox</span><font color="#336699"> </font></a>：一个<span>收集</span> 了网上很多<span>开源</span> 组件的站点，是进阶<span>学习</span> 的好帮手。<br />
<a href="http://code.google.com/p/flexlib/" target="_blank"><span style="color: #0000ff">FlexLib</span><font color="#336699"> </font></a>：也是一个开源Flex组件站点，不过与FlexBox不同的是，这个是原创，而FlexBox只是收集。<br />
<a href="http://www.adobe.com/devnet/flex/" target="_blank"><span style="color: #0000ff">Flex Developer Center</span><font color="#336699"> </font></a>：Adobe Flex<span>开发</span> 者中心，经常会有一些好的教程出现。<br />
<a href="http://labs.adobe.com/" target="_blank"><span style="color: #0000ff">Adobe Labs</span><font color="#336699"> </font></a>：这个不用我说了吧。<br />
Flex.org：<a href="http://www.flex.org/" target="_blank"><span style="color: #0000ff">http://www.flex.org/</span><font color="#336699"> </font></a>官方的，基本上应有尽有。<br />
2. Explorers<br />
<a href="http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html" target="_blank"><span style="color: #0000ff">Flex 2 Style Explorer</span><font color="#336699"> </font></a>：用来设计<span>程序</span> 样式风格的工具，很好用，现在源<span>代码</span> 已经可以<span>下载</span> 。<br />
<a href="http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html" target="_blank"><span style="color: #0000ff">Flex 2 Primitive Explorer</span><font color="#336699"> </font></a>：用来调节各种Primitive图形的组件，非官方的，源代码提供下载。<br />
<a href="http://www.merhl.com/flex2_samples/filterExplorer/" target="_blank"><span style="color: #0000ff">Flex 2 Filter Explorer</span><font color="#336699"> </font></a>：用来调节各种滤镜（filter），非官方的，源代码提供下载。<br />
3. Blogs<br />
<a href="http://weblogs.macromedia.com/mxna/index.cfm" target="_blank"><span style="color: #0000ff">MXNA</span><font color="#336699"> </font></a>：这个不用我说了吧，虽说这不是一个Blog，但是它聚合了所有优秀的Blog，所以把它放在Blog一栏，下面所有的Blog都在这个聚合中。<br />
Alex Uhlmann：<a href="http://weblogs.macromedia.com/auhlmann/" target="_blank"><span style="color: #0000ff">http://<span>web</span> logs.macromedia.com/auhlmann/</span><font color="#336699"> </font></a><br />
Christophe Coenraets：<a href="http://coenraets.org/" target="_blank"><span style="color: #0000ff">http://coenraets.org/</span><font color="#336699"> </font></a>特别推荐<br />
Code Slinger：<a href="http://blogs.digitalprimates.net/codeSlinger/" target="_blank"><span style="color: #0000ff">http://blogs.digitalprimates.net/codeSlinger/</span><font color="#336699"> </font></a><br />
Deitte：<a href="http://www.deitte.com/" target="_blank"><span style="color: #0000ff">http://www.deitte.com/</span><font color="#336699"> </font></a><br />
Doug mccune：<a href="http://dougmccune.com/blog/" target="_blank"><span style="color: #0000ff">http://dougmccune.com/blog/</span><font color="#336699"> </font></a>特别推荐<br />
Flex Doc Team：<a href="http://blogs.adobe.com/flexdoc/" target="_blank"><span style="color: #0000ff">http://blogs.adobe.com/flexdoc/</span><font color="#336699"> </font></a><br />
Kuwamoto：<a href="http://kuwamoto.org/" target="_blank"><span style="color: #0000ff">http://kuwamoto.org/</span><font color="#336699"> </font></a>特别推荐<br />
Macromedia Consulting：<a href="http://weblogs.macromedia.com/mc/" target="_blank"><span style="color: #0000ff">http://weblogs.macromedia.com/mc/</span><font color="#336699"> </font></a><br />
Matt Chotin：<a href="http://weblogs.macromedia.com/mchotin/" target="_blank"><span style="color: #0000ff">http://weblogs.macromedia.com/mchotin/</span><font color="#336699"> </font></a>特别推荐<br />
Peter Ent：<a href="http://weblogs.macromedia.com/pent/" target="_blank"><span style="color: #0000ff">http://weblogs.macromedia.com/pent/</span><font color="#336699"> </font></a>特别推荐<br />
Quietly Scheming：<a href="http://www.quietlyscheming.com/blog/" target="_blank"><span style="color: #0000ff">http://www.quietlyscheming.com/blog/</span><font color="#336699"> </font></a>特别推荐<br />
ScaleNine Blog：<a href="http://www.scalenine.com/blog/index.php" target="_blank"><span style="color: #0000ff">http://www.scalenine.com/blog/index.php</span><font color="#336699"> </font></a>特别推荐<br />
Steven Webster：<a href="http://weblogs.macromedia.com/swebster/" target="_blank"><span style="color: #0000ff">http://weblogs.macromedia.com/swebster/</span><font color="#336699"> </font></a><br />
EverythingFlex：<a href="http://blog.everythingflex.com/" target="_blank"><span style="color: #0000ff">http://blog.everythingflex.com/</span><font color="#336699"> </font></a>特别推荐<br />
Alex&#8217;s Flex Closet：<a href="http://blogs.adobe.com/aharui/" target="_blank"><span style="color: #0000ff">http://blogs.adobe.com/aharui/</span><font color="#336699"> </font></a>特别推荐<br />
4. <span>邮件</span> 列表<br />
FlexCoders：<a href="http://tech.groups.yahoo.com/group/flexcoders/" target="_blank"><span style="color: #0000ff">http://tech.groups.yahoo.com/group/flexcoders/</span><font color="#336699"> </font></a><br />
Flex Components：<a href="http://www.adobe.com/go/flexcomponents" target="_blank"><span style="color: #0000ff">http://www.adobe.com/go/flexcomponents</span><font color="#336699"> </font></a>非高级开发者最好别加入<br />
上面是两个比较有名的邮件列表，建议大家提问之前先搜索一下邮件存档，一般都能找到答案，找不到再提问。更多邮件列表请看这里：<a href="http://flex.org/community/" target="_blank"><span style="color: #0000ff">http://flex.org/community/</span><font color="#336699"> </font></a><br />
5.Cairngorm 相关<br />
<a href="http://cairngormdocs.org/" target="_blank"><span style="color: #0000ff">Cairngorm Documentation Group</span><font color="#336699"> </font></a>这个里面收集了基本上所有关于Cairngorm的<span>资料</span> <br />
二、国内站点<br />
1.论坛<br />
<a href="http://www.riachina.com/" target="_blank"><span style="color: #800080">RIACHINA</span><font color="#336699"> </font></a>：前身是RIACN，国内最好的Flex论坛之一。我最初知道Flex从这里开始，对这个站挺有感情，饮水思源，把它排第一。<br />
<a href="http://www.anyflex.cn/bbs/index.php" target="_blank"><span style="color: #0000ff">AnyFlex</span><font color="#336699"> </font></a>：国内最好的Flex论坛之一，成立的时间比较早，而且论坛FTP中有很多好的资料。<br />
<a href="http://javauu.com/forum-42-1.html" target="_blank"><font color="#336699">JavaUU</font></a> ： 后起之秀，主要收集一些java的<span>开源技术</span> 及热闹<span>技术</span> 资源，特别是FLEX的资源相当齐全；<br />
<a href="http://groups.google.com/group/riadev" target="_blank"><span style="color: #0000ff">RIADev</span><font color="#336699"> </font></a>：Google网上论坛，d.CAT前辈主持的，一般小问题都能解决。<br />
<a href="http://www.flexcoders.cn/" target="_blank"><span style="color: #0000ff">FlexCoders.cn</span><font color="#336699"> </font></a>：刚起步的论坛，不过看域名觉得挺有前途，呵呵。<br />
2.Blogs<br />
<br />
<a href="http://blog.ezse.com/" target="_blank"><span style="color: #0000ff">Y.X.Shawn</span><font color="#336699"> </font></a>：对Flex研究很深入，自己写一些开源的组件。<br />
<a href="http://ria.richtechmedia.com/" target="_blank"><span style="color: #0000ff">d.CAT</span><font color="#336699"> </font></a>：高级开发者，台湾的，为数不多的华语高级开发者，他还做过一个类似Caringorm的架构。<br />
<a href="http://www.k-zone.cn/" target="_blank"><span style="color: #0000ff">Kenshin</span><font color="#336699"> </font></a>：很早就开始研究Flex了，自己开发过很多东西。</div>
<img src ="http://www.blogjava.net/Crying/aggbug/265328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2009-04-13 17:11 <a href="http://www.blogjava.net/Crying/articles/265328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>12条有用的Flex代码 (http://www.cnblogs.com/xxcainiao/archive/2009/04/13/1434590.html)</title><link>http://www.blogjava.net/Crying/articles/265327.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 13 Apr 2009 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/265327.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/265327.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/265327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/265327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/265327.html</trackback:ping><description><![CDATA[<p><strong>1.复制内容到系统剪贴板</strong> <br />
System.setClipboard(strContent); </p>
<p><br />
<strong>2.复制一个ArrayCollection</strong> </p>
<p>&nbsp;&nbsp; //dummy solution( well, it works ) <br />
&nbsp;&nbsp; var bar:ArrayCollection = new ArrayCollection(); <br />
&nbsp;&nbsp; for each ( var i:Object in ac ){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bar.addItem( i ); <br />
&nbsp;&nbsp; } <br />
&nbsp;&nbsp; // fantastic ! // <br />
&nbsp;&nbsp; var bar:ListCollectionView = new ListCollectionView( ListCollectionView( ac ).list ); </p>
<p><br />
<strong>3.打开一个新浏览器窗口 <br />
</strong>navigateToURL(new URLRequest('http://52friends.com'), '_blank'); </p>
<p><br />
<strong>4.刷新浏览器</strong> <br />
navigateToURL(new URLRequest("javascript:location.reload();"),"_self") </p>
<p><br />
<strong>5.关闭浏览器</strong> <br />
navigateToURL(new URLRequest("javascript:window.close()"),"_self"); </p>
<p><br />
<strong>6.设置Alert 窗口的背景为透明</strong> <br />
Alert <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; modalTransparency:0.0;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; modalTransparencyBlur:0; <br />
&nbsp;&nbsp;&nbsp; } </p>
<p><br />
<strong>7.取随机颜色</strong> </p>
<p>lbl.setStyle('color', 0xffffff*Math.random()); <br />
&nbsp;</p>
<p><strong>8.清除子串左侧空格</strong> </p>
<p>public function LTrim(s : String):String <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var i : Number = 0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(s.charCodeAt(i) == 32 || s.charCodeAt(i) == 13 || s.charCodeAt(i) == 10 || s.charCodeAt(i) == 9) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.substring(i,s.length); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;</p>
<p><strong>9.清除字串右侧空格</strong> <br />
public function RTrim(s : String):String <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var i : Number = s.length - 1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(s.charCodeAt(i) == 32 || s.charCodeAt(i) == 13 || s.charCodeAt(i) == 10 ||s.charCodeAt(i) == 9) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i--; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.substring(0,i+1); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;</p>
<p><strong>10.清除字串左右的空格</strong> <br />
public function Trim(s : String):String <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return LTrim(RTrim(s)); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;</p>
<p><strong>11.获取数据类型</strong> </p>
<p>getQualifiedClassName(data) <br />
&nbsp;</p>
<p><strong>12.生成随机字符串.</strong><br />
private function GenerateCheckCode():String <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //init <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ran:Number; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var number:Number; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var code:String; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var checkCode:String =""; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //get 4 radom <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i:int=0; i&lt;4; i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ran=Math.random(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number =Math.round(ran*10000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //get result like 0.1234 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(number % 2 == 0) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = String.fromCharCode(48+(number % 10));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //0's ASCII code is 48 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = String.fromCharCode(65+(number % 26)) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // A's ASCII code is 65 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkCode += code; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return checkCode; <br />
&nbsp; } </p>
<img src ="http://www.blogjava.net/Crying/aggbug/265327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2009-04-13 17:10 <a href="http://www.blogjava.net/Crying/articles/265327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Bindable] 用法 （转过来）</title><link>http://www.blogjava.net/Crying/articles/265326.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 13 Apr 2009 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/265326.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/265326.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/265326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/265326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/265326.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>[Bindable]大概又是Flex用得最多的元数据了。刚开始用用确实好简单，效率真是没的说。不过这几天用着却碰到了些问题，我自己搜集了些资料，想着有必要在blog里总结一下吧。</p>
<h3>啥是元数据（metadata）</h3>
<p>知道就跳过吧。今天不晓得为什么livedoc.adobe.com这么慢，没办法，拿不到权威的解释了。我就按自己的理解随便解释一下：首先要明白元数据不是语法的一部分，而是专门给编译器用的，说白了是告诉编译器做某些事情，学过java之类的应该知道。那Bindable来讲，它的作用是告诉flex编译器，给某些某些东西建立绑定关系，flex编译器会在编译过程中给AS（flex编译器就是把mxml编译成as，再编译到swf，也可能直接编译倒swf，我这里假设有as这么个环节）加一点事件发生和处理之类的代码，由此绑定的关系便建立了，如果我们用纯粹as3代码来写也是可以实现的，就是太太太麻烦。</p>
<h3>啥是绑定</h3>
<p>知道继续跳过。举个例子：给下面的public变量加上[Bindable]</p>
<div class="wp_syntax" style="padding-bottom: 0px">
<div class="code">
<pre class="actionscript" style="font-family: monospace"><span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">public</span> <span style="font-weight: bold; color: #000000">var</span> <span style="color: #0066cc">name</span>:<span style="color: #0066cc">String</span> = <span style="color: #ff0000">""</span>;</pre>
</div>
</div>
<p>作为一个public变量，肯定既可以被赋值，也能赋值给别的变量。绑定的作用就是，当name改变的时候（被赋值了），可能通知其它被name影响（赋值给它们）的变量发生改变。这里的&#8220;可能&#8221;就需要编译器来判断，这就是为什么元数据是给编译器用的原因了。在mxml里用{}的语法的地方就是绑定的对象，比如label={xxx.name}，当name变化，label也跟着变化。这样，我们只是很简单的改变了name的值，由于有绑定，界面上的label也跟着自动变化了，爽吧。</p>
<h3>能用在哪里</h3>
<p>三个地方：类, 变量, getter/setter。是不是public没有关系，private的就只能给自家用呗。用在Class上就是简单的给所有的public属性（包括变量，getter/setter，普通方法）加上[Bindable]，可是一般的方法不能用[Bindable]呀，于是一般就能看到flex给了个warning，直接无视:)。变量嘛就是上面讲的，很简单略掉。</p>
<h3>用在只读，只写属性（getter/setter）上面</h3>
<p>终于讲到关键地方了，因为getter和setter很像方法，用起来会有点不同。看看这个例子：</p>
<div class="wp_syntax" style="padding-bottom: 0px">
<div class="code">
<pre class="actionscript" style="font-family: monospace"><span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">private</span> <span style="font-weight: bold; color: #000000">var</span> content:<span style="color: #0066cc">Array</span> = <span style="font-weight: bold; color: #000000">new</span> <span style="color: #0066cc">Array</span><span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;
<span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">public</span> <span style="font-weight: bold; color: #000000">function</span> <span style="color: #0066cc">set</span> _content<span style="color: #66cc66">(</span>ct:<span style="color: #0066cc">String</span><span style="color: #66cc66">)</span>:<span style="color: #0066cc">void</span>
<span style="color: #66cc66">{</span>
content = ct.<span style="color: #0066cc">split</span><span style="color: #66cc66">(</span>SEP<span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
<span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">public</span> <span style="font-weight: bold; color: #000000">function</span> <span style="color: #0066cc">get</span> _wholeText<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>:<span style="color: #0066cc">String</span>
<span style="color: #66cc66">{</span>
<span style="color: #b1b100">if</span><span style="color: #66cc66">(</span>content.<span style="color: #0066cc">length</span> == <span style="color: #cc66cc">0</span><span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
<span style="color: #b1b100">return</span> <span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #66cc66">}</span>
<span style="color: #b1b100">else</span>
<span style="color: #66cc66">{</span>
<span style="font-weight: bold; color: #000000">var</span> _w:<span style="color: #0066cc">String</span> = <span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #b1b100">for</span><span style="color: #66cc66">(</span><span style="font-weight: bold; color: #000000">var</span> i:<span style="color: #0066cc">int</span>=<span style="color: #cc66cc">0</span> ; i<span style="color: #66cc66">&amp;</span>lt;content.<span style="color: #0066cc">length</span> ; i++<span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
_w += content<span style="color: #66cc66">[</span>i<span style="color: #66cc66">]</span> + <span style="color: #66cc66">&amp;</span>quot;\r\n<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #66cc66">}</span>
<span style="color: #b1b100">return</span> _w;
<span style="color: #66cc66">}</span>
<span style="color: #66cc66">}</span></pre>
</div>
</div>
<p>原来的设想是content绑定_wholeText，可它是不工作的。为什么？_wholeText太复杂了，被编译器排除在&#8220;可能&#8221;之外，编译器认为没有绑定关系，如果只是简单的return content，倒是可以的。我这里搜到了一些比较权威的解释。来自<a href="http://www.rubenswieringa.com/blog/binding-read-only-accessors-in-flex">http://www.rubenswieringa.com/blog/binding-read-only-accessors-in-flex</a>找到Ely Greenfield讲的。</p>
<blockquote>
<p>Now keep in mind that there&#8217;s no way for the compiler to actually tell if the value of a property get function would be different if called, short of doing an extensive code flow analysis of the get function, identifying all the inputs that might be affecting the value of the get function (i.e., member fields, statics, globals that are used in the get function and in any methods, global functions, closures, etc) it might call, and setting up watchers on every one of those to trigger the binding when any of them change. That&#8217;s prohibitively difficult, and expensive to do. So the compiler doesn&#8217;t try.</p>
<p>Instead when you put [Bindable] on a get/set property, the compiler makes it bindable with a little creative rewriting that allows the framework to watch the get function, and dispatch a change event when the get function is triggered. This means that automatic bindable properties don&#8217;t work when the get function is computed from multiple values, or when you change its value by setting a backing field, rather than using the set function.</p>
<p>It _also_ means that if you have no set function, we can pretty much guarantee that there&#8217;s no way automatically bindable get properties will be triggered. a read only propeerty is, to the compiler, completely opaque&#8230;at the moment, it has no idea where that value is coming from, and hence will never be able to &#8216;automatically&#8217; trigger the binding.</p>
</blockquote>
<p>说白了就是为了降低复杂度和提高效率，复杂情况的getter会被忽略。如何解决？可以手动建立绑定，即[Bindable("eventName")]。把代码改成这样：</p>
<div class="wp_syntax" style="padding-bottom: 0px">
<div class="code">
<pre class="actionscript" style="font-family: monospace"><span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">private</span> <span style="font-weight: bold; color: #000000">var</span> content:<span style="color: #0066cc">Array</span> = <span style="font-weight: bold; color: #000000">new</span> <span style="color: #0066cc">Array</span><span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;
<span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">]</span>
<span style="color: #0066cc">public</span> <span style="font-weight: bold; color: #000000">function</span> <span style="color: #0066cc">set</span> _content<span style="color: #66cc66">(</span>ct:<span style="color: #0066cc">String</span><span style="color: #66cc66">)</span>:<span style="color: #0066cc">void</span>
<span style="color: #66cc66">{</span>
content = ct.<span style="color: #0066cc">split</span><span style="color: #66cc66">(</span>SEP<span style="color: #66cc66">)</span>;
<span style="color: #0066cc">this</span>.<span style="color: #006600">dispatchEvent</span><span style="color: #66cc66">(</span><span style="font-weight: bold; color: #000000">new</span> Event<span style="color: #66cc66">(</span><span style="color: #66cc66">&amp;</span>quot;_contectChanged<span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">)</span><span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
<span style="color: #66cc66">[</span>Bindable<span style="color: #66cc66">(</span><span style="color: #66cc66">&amp;</span>quot;_contectChanged<span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">)</span><span style="color: #66cc66">]</span>
<span style="color: #0066cc">public</span> <span style="font-weight: bold; color: #000000">function</span> <span style="color: #0066cc">get</span> _wholeText<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>:<span style="color: #0066cc">String</span>
<span style="color: #66cc66">{</span>
<span style="color: #b1b100">if</span><span style="color: #66cc66">(</span>content.<span style="color: #0066cc">length</span> == <span style="color: #cc66cc">0</span><span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
<span style="color: #b1b100">return</span> <span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #66cc66">}</span>
<span style="color: #b1b100">else</span>
<span style="color: #66cc66">{</span>
<span style="font-weight: bold; color: #000000">var</span> _w:<span style="color: #0066cc">String</span> = <span style="color: #66cc66">&amp;</span>quot;<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #b1b100">for</span><span style="color: #66cc66">(</span><span style="font-weight: bold; color: #000000">var</span> i:<span style="color: #0066cc">int</span>=<span style="color: #cc66cc">0</span> ; i<span style="color: #66cc66">&amp;</span>lt;content.<span style="color: #0066cc">length</span> ; i++<span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
_w += content<span style="color: #66cc66">[</span>i<span style="color: #66cc66">]</span> + <span style="color: #66cc66">&amp;</span>quot;\r\n<span style="color: #66cc66">&amp;</span>quot;;
<span style="color: #66cc66">}</span>
<span style="color: #b1b100">return</span> _w;
<span style="color: #66cc66">}</span>
<span style="color: #66cc66">}</span></pre>
</div>
</div>
<p>这样就避免了编译器去自动识别。自己加上绑定关系，当_content被赋值，发出_contentChanged事件，通知所有被绑定的getter方法执行一遍。这也说明了，绑定不过是事件游戏而已，flex为用户隐藏了很多底层算法。</p>
</div>
<img src ="http://www.blogjava.net/Crying/aggbug/265326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2009-04-13 17:08 <a href="http://www.blogjava.net/Crying/articles/265326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FLEX 快捷键（转）</title><link>http://www.blogjava.net/Crying/articles/265325.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 13 Apr 2009 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/265325.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/265325.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/265325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/265325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/265325.html</trackback:ping><description><![CDATA[<div class="postbody">Ctrl-F11: 执行（Run） <br />
F11: 除错（Debug） <br />
Ctrl-Alt-Down: 重复目前所在编辑列（Repeat current line ） <br />
Alt-Up: 移动本列，或选择列往上移动（Move line (or selection) up ） <br />
Alt-Down: 移动本列，或选择列下往移动（Move line (or selection) down ） <br />
Ctrl-Click: 移至定义区（Go to definition (also F3) ） <br />
Ctrl-D: 删除本列（Delete line ） <br />
Alt-/: 文字自动完成（Word completion (cycles through possible matches)） <br />
Ctrl-Up: 捲轴向上（Scroll up ） <br />
Ctrl-Down: 捲轴向下（Scroll Down ） <br />
（组合键） Ctrl+Shift+L <br />
(Activate Editor) F12 <br />
(Align Baselines) Ctrl + Alt + 8 <br />
(Align Bottom) Ctrl + Alt + 6 <br />
(Align Horizontal Centers) Ctrl + Alt + 5 <br />
(Align Left) Ctrl + Alt + 1 <br />
(Align Right) Ctrl + Alt + 3 <br />
(Align Top) Ctrl + Alt + 4 <br />
(Align Vertical Centers) Ctrl + Alt + 2 <br />
<br />
(Backward History) Alt + Left <br />
(Breakpoints) Alt + Shift + Q,B <br />
(Build All) Ctrl + B <br />
(Cheat Sheets) Alt + Shift +Q,H <br />
(Close) Ctrl + F4 <br />
(Close All) Ctrl + Shift + F4 <br />
(Console) Alt + Shift + Q,C <br />
(Content Assist) Alt + / <br />
(Context Information) Alt + Shift + ? <br />
(Copy) Ctrl + C <br />
(Cut) Ctrl + X <br />
(Debug Adobe AIR Application) Alt + Shift + D,L <br />
(Debug Flex Application) Alt + Shift +D,F <br />
(Debug Last Launched) F11 <br />
(Delete) Delete <br />
(Find Text in Workspace) Ctrl + Alt + G <br />
(Find and Replace) Ctrl + F <br />
(Find in Files) Ctrl + Shift + F <br />
(Fit to Window) Ctrl + 0 <br />
(Forward History) Alt + Right <br />
(History) Alt + Shift + Q,Z <br />
(Last Edit Location) Ctrl + Q <br />
(Make Same Height) Ctrl + Alt + 9 <br />
(Make Same Width) Ctrl + Alt + 7 <br />
(Maximize Active View or Editor) Ctrl + M <br />
(New) Ctrl + N <br />
(New menu) Alt + Shift + N <br />
(Next) Ctrl + . <br />
(Next Editor) Ctrl + F6 <br />
(Next Perspective) Ctrl + F8 <br />
(Next View) Ctrl + F7 <br />
(Open Resource) Ctrl + Shift + R <br />
(Open Search Dialog) Ctrl + H <br />
(Paste) Ctrl + V <br />
(Previous) Ctrl + , <br />
(Previous Editor) Ctrl + Shift + F6 <br />
(Previous Perspective) Ctrl + Shift + F8 <br />
(previous View) Ctrl + Shift + F7 <br />
(print) Ctrl + P <br />
(Profile Adobe AIR Application) Alt + Shift + P,L <br />
(Profile Flex Application) Alt + Shift + P,F <br />
(Properties) Alt + Enter <br />
(Quick Access) Ctrl + 3 <br />
(Quick Fix) Ctrl + 1 <br />
(Quick Switch Editor) Ctrl + E <br />
(Redo) Ctrl + Y <br />
(Refresh) F5 <br />
(Remove All Visible Results) Shift + Delete <br />
(Remove Result) Ctrl + Delete <br />
(Rename) F2 <br />
(Run Adobe AIR Application) Alt + Shift + X, L <br />
(Run Flex Application) Alt + Shift + X, F <br />
(Run Last Launched) Alt + F11 <br />
(Save) Ctrl + F11 <br />
(Save All) Ctrl + Shift + S <br />
(Search) Alt + Shif + Q, S <br />
(Select All) Ctrl + A <br />
(Show In menu) Alt + Shift + W <br />
(Show Key Assist) Ctrl + Shift + L <br />
(Show System Menu) Alt + - <br />
(Show View) Alt + Shift + Q , Q <br />
(Show View [View:Outline]) Alt + Shift + Q ,0 <br />
(Show View [View:Problems]) Alt + Shift + Q , X <br />
(Show View Menu) Ctrl + F10 <br />
(Switch Source/Design Mode) Ctrl + &#8216; <br />
(Switch to Editor) Ctrl + Shift + Q , Y <br />
(Terminate Result) Ctrl + Break <br />
(Toggle Breakpoint) Ctrl + Shift + B <br />
(Undo) Ctrl + Z <br />
(Use Step Filters) Shift + Z <br />
(Variables) Alt + Shift + Q , V <br />
(Zoom In) Ctrl + = <br />
(Zoom Out) Ctrl + - </div>
<img src ="http://www.blogjava.net/Crying/aggbug/265325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2009-04-13 17:07 <a href="http://www.blogjava.net/Crying/articles/265325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>