翻译: Flex Collection 事件和手动通知变化

本文介绍了Flex中如何使用CollectionEvent、PropertyChangeEvent等事件来监控集合的变化,并通过itemUpdated方法和enableAutoUpdate/disableAutoUpdate方法来确保数据视图能够正确响应集合内部数据的变更。
  转自:riameeting 集合用事件来表示集合发后了变化. 你能用这些事件监控变化以作相应的显示上的更新.
  Collection事件: CollectionEvent, PropertyChangeEvent和FlexEvent. 当今集合发生变化时, 发布 CollectionEvevnt.COLLECTION_CHANGE.
  CollectionEvent.kind(CollectionEventKind类型)用来表示是什么变化类型,比如UPDATE.
  CollectionEvent.items(是一个Array类型), 如果是ADD和REMOVE kind 事件, 这个数组包含了被删除或是被增加的items. 对于UPDATE事件, items则是一个事件数组,数组成员全都是PropertyChangeEvent, 每个事件表示相应的item的update
  PropertyChangeEvent.kind(类型是PropertyChangeEventKind)表示是那个属性发生了变化.
  当游标位置发生了变化, 视图游标(View cursor)发布一个事件. type属性是FlexEvent.CURSOR_UPDATE
  你可以用这些集合事件来监控集合变化以更新显示。例如,一个自定义控件用一个collection作为它的data provider, 你肯定想每次collection发生变化时控件能被自动更新以显示修改后的最新数据. 这时上面这些集合事件就能派上用场.
  假设我们做一个汽车租赁的预定系统. 应用程序就能用COLLECTION_CHANGE 事件来监听 预定信息和汽车信息.为这个事件的侦听器函数起个名字叫 reservationsChanged,这个函数判断 Change事件的kind 字段以作以下的不同业务逻辑. 如果kind是ADD, 遍历事件的items属性,调用一个函数更新预定信息的显示(一个显示所有预定时间的框)
  如果kind是REMOVE, 遍历事件的items属性, 调用一个函数将这些预定信息从框中删除
  如果kind是UPDATE, 遍历事件的items属性, 此时每个item是一个PropertyChangeEvent事件对象, 我们调用函数更新所有对应的预定信息.
  如果kind是RESET, 调用一个函数重置预定信息.
  代码如下: 大家知道, 没有实现IEventDispatcher接口的数据项是不可监控的, 而且Flash和Flex对象和其它的基本数据类型都没有实现这个接口. 因此当你修改了Array或是一个DisplayObject对象的属性时,你就必须调用itemUpdated()方法来手动更新集合视图, 这个方法将 已被修改的item对象和 修改之前的item对象 一并作为参数.
  当你必须用Array来直接作为控件的dataProvider时, 你也可以用itemUpdated()方法来手动通知collection发生了变化。Array直接作dataProvider时, 控件会将数据封装到一个collection对象, 但是这个collection封装对象在Array数据发生改变时是不知道的,所以必须用itemUpdated()手动通知。
  注: 当你直接在一个collection中增加或删除子项时,或是通过ICollectionView, IList的方法来修改colletion时, 你完全没有必须调用itemUpdated().
  大家知道, 当一个类,或是一个对象的声明上加[Bindable]时,需要类(或是对象的类)实现了IEventDispatcher接口。因为只有实现了IEventDispatcher接口才能发布事件(propertyChange事件).
  当你在类的声明之上加[Bindable]时,这个类的任何属性在发生变化时,都会发布propertyChange事件; 如果你仅是在指定属性之上加[Bindable]标记时,那只有加了[Bindable] meta tag的这些属性才会发布propertyChange事件。
  collection会侦听propertyChange事件. 假设你有一个 myCollection, 这个collection的item的类有一个[Bindable] myVariable的变量,那么 myCollection.getItemAt(0).myVariable="myText" 将会触发一个propertyChange事件(假定是没有必要使用itemUpdated()的情况).
  所以最常见的itemUpdate用法是: 一个不能Bindable的类,或是无法实现IEventDispatcher接口的类的数据(属性)发生变化时来用通知collection.下面的例子展示在这样的情景时你就可以用itemUpdated()
  假设你有一个你不能控制和再编辑的类:
  public class ClassICantEdit { public var field1:String; public var field2:String;}
  你还有一个ArrayCollection, 里面的item全都是 classICantEdit对象.
  public var myCollection:ArrayCollection = new ArrayCollection();
  你有如下一个DataGrid控件:
  
  当你象下面更改myCollection中的item的值时, DataGrid控件是不会自动更新的:
  myCollection.getItemAt(0).field1="someOtherValue";
  为更新DataGrid控件,你必须 itemUpdated()函数:
  myCollection.itemUpdated(collectionOfThoseClasses. getItemAt(0)); Collection还提供了enableAutoUpdate()和disableAutoUpdate()方法,这两个方法可以启用或是禁止数据发生变化时自动更新数据视图的功能。
  collection的 disableAutoUpdate()方法会阻止基本数据改变事件被collection视图广播.同时还阻止,collection自身作为一个结果集被改变的事件.
  当一个collection绑定为一个控件的dataProvider时, 用这个方法可以防止因collection多次变化而引起控件不必要的中间显示更新。
  例如, DataGrid控件在item被选中时,就会调用disableAutoUpdate(), 当这个item不再被选中时再调用enableAutoUpdate(),这样可以当你正在编辑一个item时,不会因为这item是在一个排序的collection中而导致在屏幕上下乱跳.
  下面的代码片断显示了怎样调用disableAutoUpdate(), enableAutoUpdate()
  var obj:myObject = myCollection.getItemAt(0);
  myCollection.disableAutoUpdate();
  obj.prop1 = 'foo';
  obj.prop2 = 'bar';
  myCollection.enableAutoUpdate(); 下面的例子你可以在DataGrid控件中增加, 删除, 修改数据 dpcontrols\ModifyDataGridData.mxml
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值