﻿<?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/kissjava/category/34870.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 20 Nov 2009 07:18:52 GMT</lastBuildDate><pubDate>Fri, 20 Nov 2009 07:18:52 GMT</pubDate><ttl>60</ttl><item><title>Flex Hack 02:DataGrid列尾，用于数据汇总</title><link>http://www.blogjava.net/kissjava/archive/2009/08/17/291563.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Mon, 17 Aug 2009 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2009/08/17/291563.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/291563.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2009/08/17/291563.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/291563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/291563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Excel的表格中会在在一组数据的后面有一行数据来显示这个表格的某一列的平均数，最大值，最小值等，在Flex中做些小动作也能做出类似效果。&nbsp;&nbsp;<a href='http://www.blogjava.net/kissjava/archive/2009/08/17/291563.html'>阅读全文</a><img src ="http://www.blogjava.net/kissjava/aggbug/291563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2009-08-17 22:27 <a href="http://www.blogjava.net/kissjava/archive/2009/08/17/291563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex Hack 01:labelFunction的使用</title><link>http://www.blogjava.net/kissjava/archive/2009/08/16/291326.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Sun, 16 Aug 2009 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2009/08/16/291326.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/291326.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2009/08/16/291326.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/291326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/291326.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:       写过Swing的人都知道，如果使用List的组件或包含List组件如JComboBox，他们的item需要显示几个字段的时候，需要做额外的动作，比如在List需要显示的对象添加一个toString方法便能组合显示出想要的效果，但是有时候一个POJO或VO又不允许你添加这么一个方法。这个时候就需要在Renderer中利用反射的机制能解决所需要的方法。<br>   <br>     但是在Flex中就能很方便的解决这样的问题，对于显示一个字段，只需要指定对应字段属性给labelField即可，当需要上述所需要的功能的时候就得做个转换了，在Flex的基于List的组件都有一个labelFunction方法能很简单指定所需要显示的内容。&nbsp;&nbsp;<a href='http://www.blogjava.net/kissjava/archive/2009/08/16/291326.html'>阅读全文</a><img src ="http://www.blogjava.net/kissjava/aggbug/291326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2009-08-16 10:32 <a href="http://www.blogjava.net/kissjava/archive/2009/08/16/291326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>actionscript之滤镜</title><link>http://www.blogjava.net/kissjava/archive/2009/07/26/288476.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Sun, 26 Jul 2009 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2009/07/26/288476.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/288476.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2009/07/26/288476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/288476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/288476.html</trackback:ping><description><![CDATA[滤镜的工作原理<br />
显示对象过滤是通过将原始对象的副本缓存为透明位图来工作的。<br />
将滤镜应用于显示对象后，只要此对象具有有效的滤镜列表，Adobe Flash Player 就会将该<br />
对象缓存为位图。然后，将此位图用作所有后续应用的滤镜效果的原始图像。<br />
每个显示对象通常包含两个位图：一个包含原始未过滤的源显示对象，另一个用于过滤后的<br />
最终图像。呈现时使用最终图像。只要显示对象不发生更改，最终图像就不需要更新。
<p>在运行时更改滤镜<br />
如果已经对显示对象应用了一个或多个滤镜，则无法向 filters 属性数组添加其它滤镜。若<br />
要添加或更改应用的这组滤镜，需要创建整个滤镜数组的副本，然后对此（临时）数组进行<br />
修改。然后，将此数组重新分配给显示对象的 filters 属性，这样才能将滤镜应用于该对<br />
象。</p>
<p>滤镜和对象变形<br />
在显示对象的边框矩形之外的任何过滤区域（例如投影）都不能视为可进行点击检测（确定<br />
实例是否与其它实例重叠或交叉）的表面。由于 DisplayObject 类的点击检测方法是基于矢<br />
量的，因此无法在位图结果上执行点击检测。例如，如果您对按钮实例应用斜角滤镜，则在<br />
该实例的斜角部分，点击检测不可用。<br />
滤镜不支持缩放、旋转和倾斜；如果过滤的显示对象本身进行了缩放（如果 scaleX 和<br />
scaleY 不是 100%），则滤镜效果将不随该实例缩放。这意味着，实例的原始形状将旋转、<br />
缩放或倾斜；而滤镜不随实例一起旋转、缩放或倾斜。<br />
可以使用滤镜给实例添加动画，以形成理想的效果，或者嵌套实例并使用 BitmapData 类使<br />
滤镜动起来，以获得此效果。</p>
<p>可用的显示滤镜<br />
ActionScript 3.0 包括 9 个可用于显示对象和 BitmapData 对象的滤镜类：<br />
■ 斜角滤镜（BevelFilter 类）<br />
■ 模糊滤镜（BlurFilter 类）<br />
■ 投影滤镜（DropShadowFilter 类）<br />
■ 发光滤镜（GlowFilter 类）<br />
■ 渐变斜角滤镜（GradientBevelFilter 类）<br />
■ 渐变发光滤镜（GradientGlowFilter 类）<br />
■ 颜色矩阵滤镜（ColorMatrixFilter 类）<br />
■ 卷积滤镜（ConvolutionFilter 类）<br />
■ 置换图滤镜（DisplacementMapFilter 类）</p>
<p>斜角滤镜<br />
BevelFilter 类允许您对过滤的对象添加三维斜面边缘。此滤镜可使对象的硬角或边缘具有硬<br />
角或边缘被凿削或呈斜面的效果。<br />
BevelFilter 类属性允许您自定义斜角的外观。您可以设置加亮和阴影颜色、斜角边缘模糊、<br />
斜角角度和斜角边缘的位置，甚至可以创建挖空效果。</p>
<p>模糊滤镜<br />
BlurFilter 类可使显示对象及其内容具有涂抹或模糊的效果。模糊效果可以用于产生对象不<br />
在焦点之内的视觉效果，也可以用于模拟快速运动，比如运动模糊。通过将模糊滤镜的<br />
quality 属性设置为低，可以模拟轻轻离开焦点的镜头效果。将 quality 属性设置为高会<br />
产生类似高斯模糊的平滑模糊效果。</p>
<p>投影滤镜<br />
投影给人一种目标对象上方有独立光源的印象。可以修改此光源的位置和强度，以产生各种<br />
不同的投影效果。<br />
投影滤镜使用与模糊滤镜的算法相似的算法。主要区别是投影滤镜有更多的属性，您可以修<br />
改这些属性来模拟不同的光源属性（如 Alpha、颜色、偏移和亮度）。<br />
投影滤镜还允许您对投影的样式应用自定义变形选项，包括内侧或外侧阴影和挖空（也称为<br />
剪切块）模式。</p>
<p>发光滤镜<br />
GlowFilter 类对显示对象应用加亮效果，使显示对象看起来像是被下方的灯光照亮，可创造<br />
出一种柔和发光效果。<br />
与投影滤镜类似，发光滤镜包括的属性可修改光源的距离、角度和颜色，以产生各种不同效<br />
果。GlowFilter 还有多个选项用于修改发光样式，包括内侧或外侧发光和挖空模式。</p>
<p>渐变斜角滤镜<br />
GradientBevelFilter 类允许您对显示对象或 BitmapData 对象应用增强的斜角效果。在斜<br />
角上使用渐变颜色可以大大改善斜角的空间深度，使边缘产生一种更逼真的三维外观效果。</p>
<p>渐变发光滤镜<br />
GradientGlowFilter 类允许您对显示对象或 BitmapData 对象应用增强的发光效果。该效<br />
果可使您更好地控制发光颜色，因而可产生一种更逼真的发光效果。另外，渐变发光滤镜还<br />
允许您对对象的内侧、外侧或上侧边缘应用渐变发光。</p>
<p>颜色矩阵滤镜<br />
ColorMatrixFilter 类用于操作过滤对象的颜色和 Alpha 值。它允许您进行饱和度更改、色<br />
相旋转（将调色板从一个颜色范围移动到另一个颜色范围）、将亮度更改为 Alpha，以及生<br />
成其它颜色操作效果，方法是使用一个颜色通道中的值，并将这些值潜移默化地应用于其它<br />
通道。<br />
从概念上来说，滤镜将逐一处理源图像中的像素，并将每个像素分为红、绿、蓝和 Alpha 组<br />
件。然后，用每个值乘以颜色矩阵中提供的值，将结果加在一起以确定该像素将显示在屏幕<br />
上的最终颜色值。滤镜的 matrix 属性是一个由 20 个数字组成的数组，用于计算最终颜色。<br />
有关用于计算颜色值的特定算法的详细信息，请参阅《ActionScript 3.0 语言和组件参考》<br />
中说明 ColorMatrixFilter 类的 matrix 属性的条目。</p>
<p>&nbsp;</p>
<p>卷积滤镜<br />
ConvolutionFilter 类可用于对 BitmapData 对象或显示对象应用广泛的图像变形，如模<br />
糊、边缘检测、锐化、浮雕和斜角。<br />
从概念上来说，卷积滤镜会逐一处理源图像中的每个像素，并使用像素和它周围的像素的值<br />
来确定该像素的最终颜色。指定为数值数组的矩阵可以指示每个特定邻近像素的值对最终结<br />
果值具有何种程度的影响。</p>
<p>置换图滤镜<br />
DisplacementMapFilter 类使用 BitmapData 对象（称为置换图图像）中的像素值在新对<br />
象上执行置换效果。通常，置换图图像与将要应用滤镜的实际显示对象或 BitmapData 实例<br />
不同。置换效果包括置换过滤的图像中的像素，也就是说，将这些像素移开原始位置一定距<br />
离。此滤镜可用于产生移位、扭曲或斑点效果。<br />
应用于给定像素的置换位置和置换量由置换图图像的颜色值确定。使用滤镜时，除了指定置<br />
换图图像外，还要指定以下值，以便控制置换图图像中计算置换的方式：<br />
■ 映射点：过滤图像上的位置，在该点将应用置换滤镜的左上角。如果只想对图像的一部<br />
分应用滤镜，可以使用此值。<br />
■ X 组件：影响像素的 x 位置的置换图图像的颜色通道。<br />
■ Y 组件：影响像素的 y 位置的置换图图像的颜色通道。<br />
■ X 缩放比例：指定 x 轴置换强度的乘数值。<br />
■ Y 缩放比例：指定 y 轴置换强度的乘数值。<br />
420 过滤显示对象<br />
■ 滤镜模式：确定在移开像素后形成的空白区域中， Flash Player 应执行什么操作。在<br />
DisplacementMapFilterMode 类中定义为常量的选项可以显示原始像素（滤镜模式<br />
IGNORE）、从图像的另一侧环绕像素（滤镜模式 WRAP，这是默认设置）、使用最近的移<br />
位像素（滤镜模式 CLAMP）或用颜色填充空间（滤镜模式 COLOR）。</p>
<img src ="http://www.blogjava.net/kissjava/aggbug/288476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2009-07-26 22:30 <a href="http://www.blogjava.net/kissjava/archive/2009/07/26/288476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataGrid透明显示背景图片，及表头透明</title><link>http://www.blogjava.net/kissjava/archive/2009/03/27/262521.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Fri, 27 Mar 2009 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2009/03/27/262521.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/262521.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2009/03/27/262521.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/262521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/262521.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp; 今天有人问我flex中怎样向DataGrid添加背景图片，以及怎样使表格透明。&nbsp;&nbsp; 其实这个查下文档就知道，可以如下用setStyle设置：dataGrid.setStyle('backgroundAlpha',alpha)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，没多久又告诉我，表...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissjava/archive/2009/03/27/262521.html'>阅读全文</a><img src ="http://www.blogjava.net/kissjava/aggbug/262521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2009-03-27 22:59 <a href="http://www.blogjava.net/kissjava/archive/2009/03/27/262521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Flex中元数据标签</title><link>http://www.blogjava.net/kissjava/archive/2009/02/04/253275.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Wed, 04 Feb 2009 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2009/02/04/253275.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/253275.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2009/02/04/253275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/253275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/253275.html</trackback:ping><description><![CDATA[<p>Flex 2 中的元数据标签<br />
——告诉编译器如何编译<br />
虽然多数Flex开发者都使 用过[Bindable]标签，但是很多人都不知道这个标签的作用甚至不知道该标签为何物。[Bindable]就是所谓的元数据标签。元数据标签是一种 特殊的标签，它在代码中的作用就是向编译器提供如何编译程序的信息。实际上，这些标签并没有被编译到生成的SWF文件中，而只是告诉编译器如何生成SWF 文件。文档中列出的元数据标签共有12个，本文将讲解这些元数据标签的定义并给出使用它们的示例，在看完这篇文章之后，你就会明白应该在何时何处在你的 Flex 2应用程序中使用元数据标签了。<br />
<span style="color: red">[ArrayElementType]</span><br />
实际上，定义一个数组通常来说是一件很平常的事情，因为数组中的元素可以是任何类型的。不过，使用ArrayElementType元数据标签可以让你定义数组元素的数据类型。下面的例子展示了如何使用[ArrayElementType]：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">[ArrayElementType(&#8221;String&#8221;)]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />public&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;arrayOfStrings:Array;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[ArrayElementType(&#8221;Number&#8221;)]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />public&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;arrayOfNumbers:Array;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[ArrayElementType(&#8221;mx.core.UIComponent&#8221;)]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />public&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;arrayOfUIComponents:Array;</span></div>
<p><br />
<span style="color: red">[Bindable]</span><br />
Bindable元数据标签是最经常用到的一个元数据标签，因为它使程序组件之间的数据同步变得很容易。Bindable可以用来绑定简单数据类型、类、复杂数据类型以及函数。绑定数据的时候，你必须先使用元数据标签定义一下数据，正如Listing 1中所示的那样。图1是Listing 1的代码运行结果。<br />
图1：<br />
<img height="127" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-2412326.jpg" width="320" border="0" /></p>
<p>Bindable也可以用来绑定到事件。Listing 2展 示了如何使用getter和setter函数将一个属性绑定到一个事件上。这个例子中有一个叫做phoneNumber的私有变量，还有一个公有的 setter和getter函数。使用Bindable标签将这个getter方法绑定到了一个叫做phoneNumberChanged的事件上，只要 数据发生改变setter方法就会分派phoneNumberChanged事件。通过使用setter方法，可以在数据赋予私有变量之前对其进行操作。 在这个例子中，数据只有在长度大于等于10的时候才会被格式化。当phoneNumberChanged事件被分派的时候，第二个TextInput组件 会被更新，因为他的text属性绑定到了phoneNumber变量上。<br />
图2和图3显示了Listing 2代码的运行结果。<br />
图2：<br />
<img height="129" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-553.jpg" width="320" border="0" /><br />
</p>
<p>图3：<br />
<img height="129" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-003.jpg" width="320" border="0" /><br />
</p>
<p><span style="color: red">[DefaultProperty]</span><br />
DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性，而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3展示了一个简单的Button类，它将label属性设定为了DefaultProperty。Listing 4展示了label属性是如何在自定义Button标签中作为一个字符串定义的。<br />
<span style="color: red">[Embed]</span><br />
Embed元数据标签用来导入图片到程序。可以通过两种方式使用Embed。你可以将图片嵌入到ActionScript中并将其指派给一个变量（如同下面代码中的第一个例子），或者你也可以将图片直接指派给组件的属性（使用下面代码中的第二个例子所示的语法规则）。<br />
例1：</p>
<p>[Embed(source=&#8221;myIcon.gif&#8221;)]<br />
[Bindable]<br />
public var myIcon:Class;&lt;mx:Button label=&#8221;Icon Button 1&#8243; icon=&#8221;{myIcon}&#8221;/&gt;<br />
&lt;mx:Button label=&#8221;Icon Button 2&#8243; icon=&#8221;{myIcon}&#8221;/&gt;<br />
例2：</p>
<p>&lt;mx:Button label=&#8221;Icon Button 1&#8243; icon=&#8221;@Embed(source=myIcon.gif&#8217;)&#8221;/&gt;&lt;mx:Button label=&#8221;Icon Button 2&#8243; icon=&#8221;@Embed(source=myIcon.gif&#8217;)&#8221;/&gt;<br />
上面这两个例子产生的结果是一样的。创建myIcon类的好处是，它在一个类中只定义一次并可以绑定到程序中的多个组件。<br />
[Event]<br />
Event元数据标签用来声明那些被自定义类分派的事件。将这个元数据标签添加到类定义中之后，你就可以在MXML标签中添加事件处理函数来初始化该自定义类。Listing 5创建了一个自定义Button类，每当它的label属性改变的时候就会分派一个事件。Listing 6所显示的主程序文件初始化了这个自定义Button并创建了事件处理函数，该函数将新的labe属性值赋给了一个TextArea组件以显示当前发生的更改。<br />
图4显示了Listing 5 和 Listing 6中的代码运行结果。<br />
图4：<br />
<img height="221" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-004.jpg" width="320" border="0" /><br />
</p>
<p><span style="color: red">[Effect]</span><br />
Effect元数据标签用来定义一个自定义效果，当某个事件发生的时候该效果会被分派。这个示例可以基于前面Event的例子来创建，通过简单地更改ButtonLabel类(Listing 7)中的一行代码，就定义了一个效果，该效果可以在MXML标签中直接使用(Listing 8)。<br />
[IconFile]<br />
IconFile 是用来定义一个jpg，gif或者png文件的文件名的，它在你的自定义类中作为图标来使用。[Embed]元数据标签可以用来嵌入图片、SWF文件、音 乐文件以及视频文件等，而IconFile则只是用来嵌入用来作为自定义类图标的文件。下面是一个IconFile的例子：<br />
[IconFile(&#8221;icon.png&#8221;)]<br />
public class CustomButton extends Button<br />
{}<br />
<span style="color: red">[Inspectable]</span><br />
在使用Flex Builder 2的时候，你可能会希望某些自定义组件的属性在代码提示和属性检查器（property inspector）中显示，Inspectable元数据标签就是用来定义那些属性的。Listing 9展示的例子定义了一个inspectable的ccType变量，它定义了Visa为默认值、Credit Card为类别并将取值范围定义为包含了Visa, Mastercard, Discover, 和 American Express的枚举。<br />
图5展示了当将组件添加到程序中的时候所显示的代码提示。<br />
图5：<br />
<img height="240" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-005.jpg" width="318" border="0" /><br />
</p>
<p>图6与上面展示的是同样的代码，但是这次是设计视图，所以我们能看到属性检查器。你可以看到属性ccType的类别为Credit Card，它的所有可选的值都在下拉列表中。<br />
图6：<br />
<img height="240" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-006.jpg" width="318" border="0" /><br />
</p>
<p><span style="color: red">[InstanceType]</span><br />
当在一个模板对象中声明一个像IDeferredInstance这样的变量时，InstanceType元数据标签就用来声明对象的类型。下面是InstanceType的用法：<br />
[InstanceType(&#8221;package.className&#8221;)]<br />
[NonCommittingChangeEvent]<br />
NonCommittingChangeEvent元数据标签在某个特定事件发生的时候可以防止变量在事件发生的过程中被更改。Listing 10展 示了它是如何工作的。一个名为s的字符串类型的私有变量被绑定到了名为ti2的TextInput组件上。另外一个id为ti1的TextInput组件 在它的text发生更改的时候就会将s的值设置为它的text属性的值。另外，当triggerBinding 事件被分派的时候，附加在s变量上的Binding元数据标签就会进行绑定。只有在Enter键在ti1 TextInput组件中被按下时才会分派triggerBinding事件。<br />
<span style="color: red">[RemoteClass]</span><br />
RemoteClass 可以用来将一个ActionScript类绑定到一个Java类或一个ColdFusion CFC。这样做可以自动转换数据类型。下面的例子将包com.mydomain中的名为MyClass的ActionScript类绑定到了同一个包中名 为MyClass的Java类：<br />
package com.mydomain {<br />
[Bindable]<br />
[RemoteClass(alias=&#8221;com.mydomain.MyClass&#8221;)]<br />
public class MyClass {<br />
public var id:int; public var myText:String;<br />
}<br />
}<br />
<span style="color: red">[Style]</span><br />
Style元数据标签用来为组件定义自定义样式属性的。只需要简单地将Sytle元数据标签添加到类的定义当然，然后就可以使用getSytle方法获取它的值了。Listing 11 和 12中的例子定义了两个样式，分别为borderColor 和fillColor，它们的数据类型都是uint。当类初始化的时候这两个样式就会在标签中被设定。代码中覆写了updateDisplayList函数，用自定义的样式画了一个圆形边框并将其填充。<br />
图7展示了Listing 11 和 Listing 12中代码运行的结果。<br />
图7：<br />
<img height="240" alt="" src="http://xinsync.xju.edu.cn/wordpress/wp-content/uploads/2008/02/2007-4-007.jpg" width="273" border="0" /><br />
</p>
<p>现在你应该会有这样的感觉了：&#8220;喔，现在我知道在哪里可以使用它们了&#8221;或者&#8220;嗯，我想我会在新的项目中尝试使用这些元数据标签&#8221;。如果你没有，那么你可能需要回过头去再看一遍这篇文章。OK，我想说的是Adobe Flex小组提供给我们的元数据标签不只是非常的强大，可以让我们扩展或自定义我们要做的东西，而且它还非常易于使用。通过使用它们，仅仅几行代码就可以完成一大堆事情。如果不使用这些标签，你会发现在Flex 2中实现一些东西是很辛苦的。<br />
本文来源于 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址：http://xinsync.xju.edu.cn/index.php/archives/1615<br />
</p>
<img src ="http://www.blogjava.net/kissjava/aggbug/253275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2009-02-04 16:38 <a href="http://www.blogjava.net/kissjava/archive/2009/02/04/253275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Flex调用SWF查看PDF</title><link>http://www.blogjava.net/kissjava/archive/2008/09/26/231383.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Fri, 26 Sep 2008 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2008/09/26/231383.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/231383.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2008/09/26/231383.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/231383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/231383.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有时候一些资料只能给别人看，如可打印的文档如doc，pdf，但不能让其他无权限的人另存或者打印，特别是web版的文件管理类的系统，总会考虑到这个问题。这里讲一个小例子如何让pdf转成swf，让别人只能查看该文档。而不能打印和另存为&nbsp;&nbsp;<a href='http://www.blogjava.net/kissjava/archive/2008/09/26/231383.html'>阅读全文</a><img src ="http://www.blogjava.net/kissjava/aggbug/231383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2008-09-26 22:17 <a href="http://www.blogjava.net/kissjava/archive/2008/09/26/231383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex事件讲解【转】</title><link>http://www.blogjava.net/kissjava/archive/2008/08/26/224539.html</link><dc:creator>kissjava</dc:creator><author>kissjava</author><pubDate>Tue, 26 Aug 2008 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/kissjava/archive/2008/08/26/224539.html</guid><wfw:comment>http://www.blogjava.net/kissjava/comments/224539.html</wfw:comment><comments>http://www.blogjava.net/kissjava/archive/2008/08/26/224539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissjava/comments/commentRss/224539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissjava/services/trackbacks/224539.html</trackback:ping><description><![CDATA[文章来自：<a href="http://www.riachina.com/showtopic-8747.html">http://www.riachina.com/showtopic-8747.html</a><br />
关于flex事件的讲解<br />
<br />
一．引<br />
<br />
很多新人对Flex的事件机制都不太熟悉，在使用过程中难免会出现各种问题，这是一个非常普遍的问题，为了更快更好的帮助大家，将介绍一下Flex中事件的各种机制和用法。<br />
<br />
Flex的精髓之一就是事件和绑定机制，了解之后，能帮助大家更灵活的设计程序，也对新手上路有一定的帮助。<br />
<br />
讲解可能不太系统，也不全面，有很多没有深入。如果高手看到后有疑问，欢迎指正。当然各位也可以提出自己的看法，或者经验分享，谢谢。<br />
<br />
二．事件机制介绍<br />
<br />
1.&nbsp; &nbsp; &nbsp; 什么是事件机制<br />
<br />
事件可以看作是一种触发机制，当满足了一定的条件后，会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件中都有click事件，这个事件就是一个MouseEvent的实例，当点击鼠标后，系统会自动抛出一个名称为click的MouseEvent事件（这种方法我们将在后面介绍到）。如果此时在click上注册一个方法，那么触发该事件时就会执行这个方法。<br />
<br />
大致示意图<br />
<img height="332" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/1.gif" width="494" border="0" />&nbsp;<br />
该示意图对应的Flex主应用的mxml代码<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">mx:Script</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!</span><span style="color: #000000">[CDATA[<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;mx.controls.Alert;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_141_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_141_221_Open_Text.style.display='none'; Codehighlighter1_141_221_Closed_Image.style.display='inline'; Codehighlighter1_141_221_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_141_221_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_141_221_Closed_Text.style.display='none'; Codehighlighter1_141_221_Open_Image.style.display='inline'; Codehighlighter1_141_221_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;clickHandler(e:MouseEvent)</span><span id="Codehighlighter1_141_221_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_141_221_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alert.show(e.currentTarget.toString());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">mx:Script</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">mx:Button&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">testBtn</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;click</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">clickHandler(event)</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;label</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">测试</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">mx:Button</span><span style="color: #000000">&gt;</span></div>
<br />
<br />
<br />
在我们写代码时，编辑器的代码补全提示列表中，有很多不同的图标，如图<br />
<img height="204" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-022.gif" width="153" border="0" /><br />
那些带有闪电的就是事件，三个小块的就是样式，空心圆圈的是属性，实心圆点的是公有方法，还有一个是效果。<br />
<br />
我们能在这个列表中看到的事件，我把它称之为事件注册通道。（官方仍然称它为事件，但是它又和普通的事件含义不同。关于事件注册通道会再下面讲述到）<br />
<br />
2.&nbsp; &nbsp; &nbsp; 事件注册通道<br />
<br />
上面说到了，这些通道是只能在mxml的代码提示中可以看到的，他的作用就是给mxml组件提供 事件触发时所执行的方法的注册通道，而且能在代码提示中可见，这样给组件提供了很大的抽象的好处，我们可以很清楚的告诉组件的使用者，组件里包含哪些事件给你调用。<br />
为什么把他区别对待？除了代码提示外，他还有一些实现上的不同。<br />
<br />
Button的click事件是继承自核心类InteractiveObject，遗憾我们看不到他的源码，但是说明了&#8220;事件注册通道&#8221;是可以继承的。<br />
<br />
我们会在自定义事件中讲述到如何声明&#8220;事件注册通道&#8221;。<br />
<br />
3.&nbsp; &nbsp; &nbsp; 事件触发方法<br />
<br />
注册通道中如果填入了函数，那么就代表触发该事件时，会执行这个方法。<br />
<br />
click="clickHandler(event)"<br />
<br />
我们看到这个方法有一个event对象作为参数传入，新人可能会问到，这个event对象哪里来的？我也没声明这个变量啊。他实际上是注册通道传给他的，默认变量名就是event。我们如果想在事件触发时传其他的参数，可以通过自定的事件对象来实现。<br />
<br />
这个对象就是这个组件分发的事件对象，即type为&#8220;click&#8221;的MouseEvent的一个实例。<br />
<br />
这个event对象包含了触发该事件时的各种信息，比如触发事件对象是哪个，监听对象是哪个，触发时鼠标点在哪里等等，不同的event类会包含不同的属性，比如KeyboardEvent包含了键盘点击了哪个键。<br />
<br />
我们也可以通过自定义一个事件类，来传递我们自己想要的各种信息。（这在后面将介绍到）<br />
<br />
<font color="red">4.&nbsp; &nbsp; &nbsp; 事件分发（重点了）</font><br />
<br />
最终继承自EventDispatcher的对象都会含有dispatchEvent这个方法，他有一个参数，事件对象。<br />
<br />
之前说到的事件注册通道，他只是一个通道，实际上事件是由这个方法来分发出去的，通道只是一个管道而已。<br />
<br />
他的作用就是分发一个事件对象，他的分发是没有目的的，一种广播形式的，Flex的事件监听线程会接收到各种各样的事件（我们称之为捕获事件，这在后面会介绍到），那么哪种才是你要的事件，标识就通过事件的type属性来区分。<br />
<br />
1）事件对象<br />
在分发事件时，将会分发一个事件对象出去。不管是那个事件类，都是继承自flash.events.Event对象的，他包含一些比较重要的属性，type和bubbles。<br />
type是事件的类型，事件监听通过这个参数来识别是否是自己所监听的事件。<br />
bubbles是个布尔值，决定了该对象是否会向上传递。默认是false。什么意思呢？画个图就明白了。<br />
比如说，当button组件分发click事件对象时，设置的bubbles为false，那么他的分发是这样的<br />
<br />
示意代码<br />
dispatchEvent(new MouseEvent( &#8220;click&#8221; , false ));<br />
<img height="353" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-07.gif" width="492" border="0" /><br />
事件对象无法跨越组件本身，当然，除了之前讲到的注册通道（这样就很形象了吧）<br />
<br />
因此，如果没有注册通道，在Flex主应用中，就无法捕获到这个button组件分发出的事件。<br />
<br />
如果我们将Bubbles设为true，他看起来就是这样<br />
dispatchEvent(new MouseEvent( &#8220;click&#8221; , true ));<br />
<br />
<img height="354" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-03.gif" width="495" border="0" /><br />
可以看到，这个事件可以跨过组件本身，到达Flex主应用里。不止这样，在帮助手册中明确说到，如果在传递过程中间一直没有被捕获的话，这个事件会逐层上传，直到最终的stage，那时如果还没被捕获，这个事件就会被销毁掉。 <br />
<br />
这样一来，即使我们没有click的事件通道，只要我们在Flex主应用中添加事件监听器（addEventListener）那么我们就可以获得到这个分发出的click事件了。<br />
<br />
那么，注册通道不是没用了吗？不是，之前说到过，注册通道是现式的，可见的，因此如果你的组件要给其他人使用，那么就非常一目了然，而不必知道你源码中究竟分发了什么事件。但是，不要监听和注册同一个事件，这样会重复执行的。（后面将讲到）<br />
<br />
5.&nbsp; &nbsp; &nbsp; 事件监听<br />
<br />
在分发中，我们讲到，如果不是通过注册通道来调用触发事件，那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件，就是通过事件的type值。<br />
<br />
比如:<br />
&lt;mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp<br />
&nbsp; &nbsp; &nbsp; creationComplete='init()'<br />
&gt; <br />
&lt;mx:Script&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;![CDATA[<br />
private function init(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; testBtn.addEventListener(&#8220;click&#8221;, clickHandler);<br />
}<br />
<br />
<br />
Flex的事件中都提供了一些静态常量，让我们调用，避免我们打错了。因此这句话可以这么写<br />
<br />
testBtn.addEventListener(MouseEvent.CLICK,clickHandler);<br />
<br />
<br />
我们看到，监听的回调方法中没有传递参数，是的，这和通道的写法有些不同，这里的回调方法（即clickHandler）只是个引用，并不是代表方法的执行，他的含义是，告诉eventLinstener，如果捕捉到click事件，那么就去找clickHandler，并执行它，event对象参数在执行时动态的传递。（如果熟悉ajax的朋友这里应该很容易懂了）<br />
<br />
他作用起来就是这样<br />
 <img height="355" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-04.gif" width="510" border="0" /><br />
如果你又注册了click的事件通道，那么这两个都会生效，显然这是多余的。<br />
<br />
&nbsp; &nbsp; &nbsp; 6.&nbsp; 关于异步和执行顺序<br />
<br />
<font color="darkorange">以前的说法有误，as里是不存在线程概念的，在远程请求时，结果事件、错误事件都是异步的。如果你需要处理结果，需要利用监听，并在回调中获取你的远程数据。<br />
而在处理本地事件时，他们仍然是同步的。（谢谢ltian 的指正）</font><br />
异步示意图<br />
<span id="attach_183" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 231px; position: absolute; top: 4906px"><img alt="" src="http://www.riachina.com/images/attachicons/attachimg.gif" border="0" /></span><img height="238" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-05.gif" width="398" border="0" /> <br />
上图可以看出，回调方法执行的顺序甚至还不如dispatchEvent之后的方法。如果接下来的方法依赖于事件回调，那么把接下来的方法写到回调方法中去<br />
 <img height="290" alt="" src="http://www.blogjava.net/images/blogjava_net/kissjava/20090216-06.gif" width="396" border="0" /><br />
<br />
三．绑定机制<br />
<br />
&nbsp; &nbsp; &nbsp; 在我们了解了事件机制后，那么理解绑定就不难了。绑定其实也是事件机制的运用<br />
<br />
&nbsp; &nbsp; &nbsp; 1.&nbsp; 什么是绑定<br />
绑定的原理就是事件，在被绑定的对象上增加了改变事件的监听，一旦某个被绑定对象改变后，就会分发一个&#8220;propertyChange&#8221;事件（默认的，也可以改变成自己定义的事件），在其他组件中，会有propertyChange的事件监听，当捕捉到该事件后，则会去更新组件的属性并显示。<br />
<br />
绑定的作用在于，将Flex中的变量、类、方法等与组件的值进行绑定。例如，一个变量如果被绑定后，那么引用该变量的组件的相关属性也会发生改变。我们用一个实例来表示<br />
<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp<br />
&nbsp; &nbsp; &nbsp; &gt;<br />
&nbsp; &nbsp; &nbsp; &lt;mx:Script&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;![CDATA[<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import mx.controls.Alert;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Bindable]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var isSelected:Boolean;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function clickHandler(e:MouseEvent){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Alert.show(e.currentTarget.toString());<br />
isSelected=isSelected?false:true; //这句话的意思是如果isSelected为true，改变它为false，如果它为false，改变它为true；<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Alert.show(isSelected.toString());<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]]&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;/mx:Script&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;mx:Button id="testBtn"&nbsp; click="clickHandler(event)" label="测试" /&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;mx:CheckBox x="60" selected="{isSelected}" /&gt;<br />
&lt;/mx:Application&gt;<br />
<br />
上述程序的效果就是，当点击button时，button不是直接改变checkbox的选中状态，而是改变isSelected这个变量，由于isSelected是被绑定了的，那么会关联的改变CheckBox的选中状态。<br />
<br />
这样看起来有些多此一举，完全可以直接改变checkbox的selected属性，我只是为了演示一下效果。如果说你的checkbox是动态构造的上百个，你不会去一个个的改变他吧。<br />
<br />
因此，我们多数会将一个数据源进行绑定声明，这样引用了这个数据源的控件，比如datagrid，在数据源发生了改变时，即使你不重新设置dataProvider，列表的数据也会刷新。当然，还有很多应用等待你去尝试。<br />
<br />
如果这个代码中取消了[Bindable]的声明，会怎么样？isSelected不会改变了吗？<br />
<br />
isSelected会改变，我们alert出来的结果也会显示结果改变了，但是checkbox的选择状态不会改变，因为当一个组件由创建到最终显示出来时是经过很多方法的，比如addChild，commitProperties，updateDisplayList等，updataDisplayList则是类似刷新显示效果一样的方法。<br />
<br />
仅仅改变属性，而不去更新显示效果那么组件不会因为属性的改变而发生任何变化。<br />
&nbsp; <br />
绑定的原理也是利用的事件分发。更复杂的绑定有待你去自己发现了<br />
<br />
<br />
<br />
四.&nbsp; 自定义事件的分发<br />
<br />
&nbsp; &nbsp; &nbsp; 这部分就不长篇大论了，因为各位应该已经掌握了事件的原理，因此贴出演示源码，并进行些简单的解释。<br />
<br />
&nbsp; &nbsp; &nbsp; 1.&nbsp; 自定义事件 components/MyEventTest.as<br />
&nbsp; &nbsp; &nbsp; package components<br />
{<br />
&nbsp; &nbsp; &nbsp; import mx.events.FlexEvent;<br />
&nbsp; &nbsp; &nbsp; public class MyEventTest extends FlexEvent<br />
&nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static const ONCHANGE:String = "onChange";<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public var eventInfo:String; //自定义的事件信息<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public function&nbsp; MyEventTest(s:String){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super(s); //如果在构造时不设bubbles，默认是false，也就是不能传递的。<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventInfo="这个事件是:"+s;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; }<br />
}<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.&nbsp; &nbsp; &nbsp; &nbsp; 自定义组件 components/ComponentForEvent.as<br />
package components<br />
{<br />
&nbsp; &nbsp; &nbsp; import flash.events.EventDispatcher;<br />
&nbsp; &nbsp; &nbsp; //这个就是声明事件注册通道的方法了。name是事件对应的名称，也就是之前提到的type。Type是该事件的类<br />
&nbsp; &nbsp; &nbsp; [Event(name="onChange", type="components.MyEventTest")]<br />
&nbsp; &nbsp; &nbsp; public class ComponentForEvent extends EventDispatcher<br />
&nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var name:String;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public function changeName(newName:String){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.name=newName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent(new MyEventTest(MyEventTest.ONCHANGE) );<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; }<br />
}<br />
<br />
3.&nbsp; &nbsp; &nbsp; &nbsp; App.mxml<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:comp<br />
&gt; <br />
&lt;mx:Script&gt;<br />
&lt;![CDATA[<br />
import mx.controls.Alert;<br />
private function&nbsp; changeName(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cfe.changeName("新名称");<br />
}<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]]&gt;<br />
&lt;/mx:Script&gt;<br />
&lt;mx:Button id="testBtn"&nbsp; click=" changeName ()" label="测试" /&gt;<br />
&lt;components:ComponentForEvent<br />
id="cfe"&nbsp; /&gt;<br />
&lt;/mx:Application&gt;<br />
 <img src ="http://www.blogjava.net/kissjava/aggbug/224539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissjava/" target="_blank">kissjava</a> 2008-08-26 18:26 <a href="http://www.blogjava.net/kissjava/archive/2008/08/26/224539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>