5.6.为Tree创建项渲染器

5.6.1.问题
为Tree 组件更改功能
5.6.2.解决方法
创建一个itemRenderer 继承自TreeItemRenderer 类
5.6.3讨论
更改一个Tree 组件功能使之比其它基于list 的组件更灵活,与DataGrid, TileList, 或List组件不同的是,你不能为Tree 组件使用dropInItemRenderer,只能继承TreeItemRenderer类来创建一个itemRenderer, TreeItemRenderer 为Tree 组件定义了默认的条目渲染器,TreeItemRenderer 的默认行为是在tree 中绘制关联的每一个条目的文本,一个可选择的图标,和一个可选的可定义图标.

通过这一节使用TreeListData 对象的父级传递TreeItemRenderer, TreeListData 定义了以下属性:
depth : int tree 中条目的层级

disclosureIcon : Class 为Tree 组件的条目描绘可定义的图标的一个类

hasChildren : Boolean 若该结点有孩子结点时为true

icon : Class 为Tree 组件的条目描绘图标的一个类

indent : int Tree 组件的当前行的默认缩排

item : Object Tree 组件的当前条目的数据

label : String 条目数据的文本表现,基于List 类的itemToLabel 方法

open : Boolean 结点开放时为true

下面这个例子使用了这个方法来改变子文本为紫色和粗体.它同样为每一个目录增加了一些文本以显示这个特别的分支中有多少对象。
+展开
-ActionScript
package oreilly.cookbook {
import mx.controls.treeClasses.*;
import mx.collections.*;
public class CustomTreeItemRenderer extends TreeItemRenderer {
public function CustomTreeItemRenderer() {
super ();
mouseEnabled = false ;
}

TreeItemRenderer 中的listData 属性涉及到Tree 对象父级的数据,它是用来判断当前渲染器数据对象包含的所有孩子
+展开
-ActionScript
override public function set data(value:Object):void {
if (value != null ) {
super.data = value;
if (TreeListData(super.listData).hasChildren) {
setStyle("color", 0x660099);
setStyle("fontWeight"'bold');
else
{
setStyle("color", 0x000000);
setStyle("fontWeight"'normal');
}
}
}

updateDisplayList 方法是被覆盖来检查当前渲染器传递的结点是否占有父级Tree 中TreeListData 正在使用的所有孩子
+展开
-ActionScript
override protected function updateDisplayList(unscaledWidth:Number,unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(super.data){
if(TreeListData(super.listData).hasChildren){
var tmp:XMLList = new XMLList(TreeListData(super.listData).item);
var myStr:int = tmp[0].children().length();
super.label.text =TreeListData(super.listData).label + "("+myStr + "objects)";
}
}
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(106)喜欢(0)flash/flex/fcs/AIR