`
蒙太奇
  • 浏览: 52187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex在Tree控件上添加CheckBox

    博客分类:
  • flex
阅读更多
告示:本文为原创文章, 如果转载请注明出处!http://summerofthatyear-gmail-com.iteye.com/blog/326302
      网上遇到很多需要在Tree控件添加CheckBox等控件的问题, 本以为把Tree的itemRenderer设置成mx.controls.CheckBox 就可以完事了, 但是试了之后才发现没有这么简单 . . .
      今天看了Tree的源码, Tree在初始化的时候默认给自己设置itemRenderer属性. 此属性值也是Flex现成的:mx.controls.treeClasses.TreeItemRenderer.
      它内部分为三部分:1,icon也是就三角形的小图标. 2,disclosureIcon文件夹图标. 3,label显示的文字. 我只要在label前面加上一个CheckBox就行了.
       于是我写了一个类:TreeCheckBoxRenderer继承mx.controls.treeClasses.TreeItemRenderer源码如下:
package com.montage.controls.treeClasses
{
import flash.events.Event;

import mx.controls.CheckBox;
import mx.controls.treeClasses.TreeItemRenderer;
import mx.controls.treeClasses.TreeListData;

/**
 * 支持CheckBox的TreeItemRenderer
 * @author Montage
 */	
public class TreeCheckBoxRenderer extends TreeItemRenderer
{
	public function TreeCheckBoxRenderer()
	{
		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
	 * @param event
	 */		
	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后移
	 * @param unscaledWidth
	 * @param unscaledHeight
	 */		
	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();
	}
}
}


测试文件如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontSize="12">
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			
			[Bindable]
			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="com.montage.controls.treeClasses.TreeCheckBoxRenderer" dataProvider="{collection}"/>
</mx:Application>


      注意:selected属性很重要, 此属性在数据源内, 标致当前节点的CheckBox是否选中.点击CheckBox会自动改变响应的数据源.  如果想知道哪些被选中的话, 就遍历Tree的dataProvider吧~
      谨以此文贡献给战斗在RIA第一线的兄弟姐妹们.
  • 大小: 11.6 KB
分享到:
评论
10 楼 蒙太奇 2009-09-25  
reanfan 写道
蒙太奇 写道
avanry 写道
我新手,没看太懂
如果我想实现选择第一层的时候,它下面的子层都选中
就像上海,点击之后,下面的几个区都选中,可以做到吗?

这个暂时要你自己判断了 监听选中的项 然后通过修改数据源来实现子级的选中。


我也是新手 请问如何在外部监听选中的项呢 请楼主详告之

这个控件目前还不支持,没有事件发出来。
你可以在changeHandler()方法里面,派发一个事件,相应的参数随事件传递出去。在外部侦听这个事件,再根据参数做相应的修改。
9 楼 reanfan 2009-09-23  
蒙太奇 写道
avanry 写道
我新手,没看太懂
如果我想实现选择第一层的时候,它下面的子层都选中
就像上海,点击之后,下面的几个区都选中,可以做到吗?

这个暂时要你自己判断了 监听选中的项 然后通过修改数据源来实现子级的选中。


我也是新手 请问如何在外部监听选中的项呢 请楼主详告之
8 楼 蒙太奇 2009-07-23  
avanry 写道
我新手,没看太懂
如果我想实现选择第一层的时候,它下面的子层都选中
就像上海,点击之后,下面的几个区都选中,可以做到吗?

这个暂时要你自己判断了 监听选中的项 然后通过修改数据源来实现子级的选中。
7 楼 avanry 2009-07-21  
我新手,没看太懂
如果我想实现选择第一层的时候,它下面的子层都选中
就像上海,点击之后,下面的几个区都选中,可以做到吗?
6 楼 蒙太奇 2009-07-21  
chxkyy 写道
在createChildren里。我只要对叶子节点添加checkbox。
我的叶子节点数据如下所示:
<treeNode type="leaf" title="华东电力企业" url="..."/>


有什么解决办法吗?


这个itemRenderer里面
private var _selectedField:String = "selected";  
默认是到当前数据节点上找selected属性,如果你用
<treeNode type="leaf" title="华东电力企业" url="..."/> 
这个数据格式的话,用要在xml里面加一个 selected="true"
<treeNode type="leaf" title="华东电力企业" url="..." selected="true"/> 
对应的itemRenderer里面的_selectedField = "@selected".
5 楼 chxkyy 2009-07-07  
在createChildren里。我只要对叶子节点添加checkbox。
我的叶子节点数据如下所示:
<treeNode type="leaf" title="华东电力企业" url="..."/>


有什么解决办法吗?
4 楼 蒙太奇 2009-03-09  
stxu1987 写道
搞错了 原来是 data[_selectedField] 这种访问属性的方式不行 用@来访问属性就可以了 thank you all the same

对itemRenderer的控件不是很方便, 你用的xml数据源,访问发生要加@.我这里默认是"selected",所以.
3 楼 stxu1987 2009-03-09  
搞错了 原来是 data[_selectedField] 这种访问属性的方式不行 用@来访问属性就可以了 thank you all the same
2 楼 蒙太奇 2009-03-07  
stxu1987 写道

protected function changeHandler( event:Event ):void&nbsp;
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( data &amp;&amp; data[_selectedField] != undefined )&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[_selectedField] = checkBox.selected;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;
这里的data 始终都是undefined&nbsp; 。 因此 , 没有将值写入 dataprovider。
如何解决?

如果你给Tree设置过dataProvider,data就不应该是undefined了.
1 楼 stxu1987 2009-03-06  
protected function changeHandler( event:Event ):void 
    {  
        if( data && data[_selectedField] != undefined )  
        {  
            data[_selectedField] = checkBox.selected;  
        }  
    }   
这里的data 始终都是undefined  。 因此 , 没有将值写入 dataprovider。
如何解决?

相关推荐

    Flex4的Tree控件加CheckBox

    在这个场景中,我们关注的是如何在Flex4的Tree控件中添加CheckBox,以便用户可以多选树形结构中的节点。 Tree控件在Flex中用于展示层次结构的数据,它允许用户展开和折叠节点,查看和导航数据结构。在很多情况下,...

    Flex Tree 中Checkbox

    2. **Checkbox集成**:在Flex Tree中添加Checkbox,通常是为了提供多选功能。这需要自定义TreeItemRenderer,以便在每个节点上显示一个Checkbox。当用户勾选Checkbox时,表示选择了该节点。这个自定义的renderer需要...

    flex带复选框的tree,flex checkboxtree

    在Flex中,Tree组件是用于显示层次结构数据的控件,而"flex带复选框的tree"(Flex CheckboxTree)则是对Tree组件的一种扩展,增加了复选框功能,用户可以对树形结构的节点进行选择或全选操作,常用于权限管理、配置...

    flex checkboxtree复选树形下拉框

    在`ReportListPage.mxml`中,开发者可能使用了`Tree`控件的自定义类,或者在`Tree`控件的基础上添加了复选框组件。他们可能会覆盖`createChildren()`方法来插入自定义的复选框,同时监听`itemClick`事件来处理复选...

    flex中tree和checkbox结合使用的插件

    在Flex开发中,Tree组件和Checkbox控件的结合使用是一个常见的需求,特别是在构建具有层级结构并需要用户进行多选操作的界面时。本插件专为此目的设计,它允许用户在树形结构中通过复选框来选择或取消选择节点,从而...

    flex Tree checkbox 修改过后的

    标题提到的“flex Tree checkbox 修改过后”,意味着原生的Flex Tree控件已经进行了自定义修改,以适应带有复选框功能的需求。 在Flex中实现Tree与Checkbox结合的关键点包括: 1. **创建自定义TreeItemRenderer**...

    flex 中tree渲染checkbox

    通过继承mx.controls.treeClasses.TreeItemRenderer类并重写其createChildren()方法,我们可以添加一个CheckBox控件到渲染器中。 ```actionscript public class TreeChkItemRenderer extends TreeItemRenderer { ...

    flex tree 中渲染checkBox

    `flex tree 中渲染checkBox`这个话题涉及到在Flex Tree组件的每个节点上添加复选框控件,使得用户能够通过单击复选框来选择或取消选择树的特定部分。这在数据分层展示和多选操作的场景中特别常见,例如文件管理器或...

    flex Tree 复选框。

    TreeItemRenderer是用于渲染Tree组件中每个节点的类,我们可以在此类中添加一个CheckBox控件,并根据节点的状态来控制它的选中状态。以下是一个基本的自定义TreeItemRenderer的代码片段: ```actionscript public ...

    CheckBoxTree.zip

    在Flex开发中,CheckBoxTree是一种常用的UI组件,它结合了树形结构和复选框功能,使得用户可以方便地对树节点进行多选操作。在本文中,我们将深入探讨如何在Flex中实现CheckBoxTree,以及相关的关键技术点。 首先,...

    构造flex3.5的带复选框的树(CheckBoxTree)

    在Flex 3中实现这个功能,我们可以利用Flex的Tree组件和CheckBox组件,结合XML数据源来构建这个自定义的控件。以下是一个详细步骤的概述: 1. **创建Tree组件**:首先,我们需要创建一个Tree组件,这是展示树状结构...

    flex tree checkbox

    而当我们谈论"flex tree checkbox"时,这意味着我们要在Tree组件的节点上添加复选框,使得用户可以对每个节点进行多选操作,提高交互性和用户体验。 首先,让我们深入了解Flex Tree组件。Tree组件是基于Adobe Flex ...

    Flex Checkbox Tree

    在Flex中,`Tree`组件是展示层次结构数据的标准控件,而`Checkbox`则是一个用户可以选择或取消选择的图形元素。将两者结合,我们就得到了`Flex Checkbox Tree`。这个组件的核心在于自定义渲染器,因为默认的`Tree`...

    Flex combox

    Flex是Adobe公司开发的一种富互联网应用程序(Rich Internet Application,RIA)框架,主要用于构建运行在浏览器上的交互式用户界面。在Flex中,Combox组件是一种常用的控件,它结合了输入框和下拉列表的功能,提供...

    flex4 下拉框可以多选 CheckBoxTreeComboBox

    `CheckBoxTreeComboBox`是Flex4中一个自定义组件,它结合了`Tree`和`ComboBox`两种控件的特点。通常,`ComboBox`是一个下拉列表,用户可以从预设的选项中选择一个;而`Tree`则呈现了一个层次结构的数据视图,用户...

    Flex课程学习(附带源码)

    Button、CheckBox、ColorPicker、DataGrid、DateField、HSlider、HorizontalList、Image、LinkButton Label、List MumericStepper、PopUpButton、ProgressBar、RadioButton、RichTextEditor、Text、TextArea、...

    FLex文档教程

    1. **控件**:包括基于文本的控件(如Label、Text、TextInput、TextArea和RichTextEditor)、基于按钮的控件(如Button、LinkButton、CheckBox、RadioButton和PopupButton)等。这些控件用于实现各种用户交互功能,...

    Flex的组件

    Flex是Adobe公司开发的一种基于ActionScript ...综上所述,高级checkboxTree的实现涉及Flex组件定制、数据绑定、事件处理、过滤算法等多个方面,通过这些知识的综合运用,可以创建出具有高效过滤和多选功能的树形组件。

    FlexBuilder教程.pdf

    在FlexBuilder中,开发者可以使用MXML来构建用户界面,MXML支持两种类型的组件:控件和容器。控件是基本的UI元素,如按钮、文本字段等;容器则是包含这些控件的区域,可以理解为屏幕上的布局容器。FlexBuilder提供了...

Global site tag (gtag.js) - Google Analytics