TreeCheckBoxRender.as
package model
{
import flash.events.Event;
import mx.controls.CheckBox;
import mx.controls.treeClasses.TreeItemRenderer;
import mx.controls.treeClasses.TreeListData;
/**
* 支持CheckBox的TreeItemRenderer
* @author jun
*
*/
public class TreeCheckBoxRender extends TreeItemRenderer
{
public function TreeCheckBoxRender()
{
super();
}
/**
* 表示checkBox控件从data中所取数据的字段
*/
private var _selectedField:String = "selected";
protected var checkBox:CheckBox;
/**
* 构建checkBox
*/
override protected function createChildren():void {
super.createChildren();
checkBox = new CheckBox();
addChild(checkBox);
checkBox.addEventListener(Event.CHANGE,changeHandler);
}
/**
* 点击checkbox时,更新dataProvider
*/
protected function changeHandler(event:Event):void {
if(data && data[_selectedField] != undefined) {
data[_selectedField] = checkBox.selected;
}
}
/**
* 初始化控件时,给checkBox赋值
*/
override protected function commitProperties():void {
super.commitProperties();
trace(data[_selectedField]);
if(data && data[_selectedField] != undefined) {
checkBox.selected = data[_selectedField];
} else {
checkBox.selected = false;
}
}
/**
* 重置itemRenderer宽度
*/
override protected function measure():void {
super.measure();
measuredWidth += checkBox.getExplicitOrMeasuredWidth();
}
/**
* 重新排列位置,将label后移
*/
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth,unscaledHeight);
var startx:Number = data ? TreeListData(listData).indent:0;
if(disclosureIcon) {
disclosureIcon.x = startx;
startx = disclosureIcon.x + disclosureIcon.width;
disclosureIcon.setActualSize(disclosureIcon.width,disclosureIcon.height);
disclosureIcon.visible = data ?TreeListData(listData).hasChildren:false;
}
if(icon) {
icon.x = startx;
startx = icon.x + icon.measuredWidth;
icon.setActualSize(icon.measuredWidth,icon.measuredHeight);
}
checkBox.move(startx,(unscaledHeight - checkBox.height)/2);
label.x = startx + checkBox.getExplicitOrMeasuredWidth();
}
}
}
Tree.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12">
<mx:Script>
<!--[CDATA[
import mx.collections.ArrayCollection;
public var collection:ArrayCollection = new ArrayCollection([
{"name" : "上海", "selected":false, "children":[
{"name":"黄浦", "selected":false },
{"name":"浦东", "selected":true },
{"name":"静安", "selected":false },
{ "name":"徐汇", "selected":false }
]},
{"name":"北京", "selected":false,"children":[
{"name":"海淀", "selected":false },
{ "name":"朝阳", "selected":true },
{"name":"丰台", "selected":false } ]}
]);
]]-->
</mx:Script>
<mx:Tree width="300" height="500" labelField="name"
itemRenderer="model.TreeCheckBoxRender" dataProvider="{collection}"/>
</mx:Application>
运行后效果: