`

替换TWaver中Tree展开合并图标

阅读更多

TWaver最大的优点之一是“灵活的定制功能”。光说不练不行,来个例子演练一下:定制Tree节点的标签。

  • 默认Tree和Network上的标签显示的是网元的name属性,设置Styles.TREE_LABEL属性后,可以让Tree显示Styles.TREE_LABEL的值,以达到Tree和Network显示不同标签的目的
  • 如果觉得这样还不够,可以设置Tree#labelFunction,比如下面的代码可以让Node显示name,Link显示Styles.TREE_LABEL:
tree.labelFunction = function(e:IElement):String{
	if(e is Link){
		return e.getStyle(Styles.TREE_LABEL);
	}else{
		return e.name;
	}
}

 

既然TWaver这么灵活,那Tree的展开合并图标能定制么?

先来看看用最原始的方式:

 

1.  先定义2个class:

 

 

[Embed(source="assets/plus.png")]
[Bindable]
public var plus:Class;

[Embed(source="assets/minus.png")]
[Bindable]
public var minus:Class;

 
2.  再设置Tree的disclosureOpenIcon和disclosureClosedIcon属性为上面定义的class

 

 

<tw:Tree id="tree2" width="100%" height="100%" disclosureOpenIcon="{minus}" disclosureClosedIcon="{plus}"/>


效果如下:

有同学就要问了,这样还是不够灵活,资源文件直接嵌入了SWF中,如果想换个图标,还得重新编译打包上传。这好说,可以用css定制组件样式(其实css也要编译成swf,这点adobe完全没有考虑到用户的实际需求,换个颜色还得编译swf,以后有时间给大家说说如何不编译swf也能用css定制样式),但是偏偏disclosureOpenIcon和disclosureClosedIcon无法用css定制样式。从mx.controls.Tree的源代码中可以看到

[Style(name="disclosureOpenIcon", type="Class", format="EmbeddedFile", inherit="no")]
[Style(name="disclosureClosedIcon", type="Class", format="EmbeddedFile", inherit="no")]

 
这说明,disclosureOpenIcon和disclosureClosedIcon的style类型为class,css可以加载class?肯定不行,不信邪的同学可以试试:

<mx:Style>
	Tree {
		disclosureOpenIcon: "assets/minus.png";
		disclosureClosedIcon: "assets/plus.png";
	}
</mx:Style>

 
运行程序会得到下面的错误:

 写道
TypeError: Error #1034: Type Coercion failed: cannot convert “assets/plus.png” to Class.
at mx.controls::Tree/initListData()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\controls\Tree.as:2663]

 
那我们就定义两个class,但是这两个class是什么class?我们来分析一下:
1.  既然是图片,我们就继承Image组件吧。
2.  既然是class,说明mx内部会不停地new这个class,所以图片资源要缓存起来。
3.  加载图片是异步的,所以要等图片加载完成后,再注册这个class。

因此就有了这2个类的定义:

package {
	import flash.display.Bitmap;
	import flash.display.Loader;

	import mx.controls.Image;

	public class disclosureOpenIcon extends Image {
		public static const loader:Loader = new Loader();

		public function disclosureOpenIcon() {
			this.source = new Bitmap(Bitmap(loader.content).bitmapData);
			this.width = loader.content.width;
			this.height = loader.content.height;
		}
	}
}

package {
	import flash.display.Bitmap;
	import flash.display.Loader;

	import mx.controls.Image;

	public class disclosureClosedIcon extends Image {
		public static const loader:Loader = new Loader();

		public function disclosureClosedIcon() {
			this.source = new Bitmap(Bitmap(loader.content).bitmapData);
			this.width = loader.content.width;
			this.height = loader.content.height;
		}
	}
}

 
下面是定制Tree展开合并图标的代码:

private static function registTreeDisclosureIcon(tree:UIComponent):void {
	registClassStyle(tree, disclosureOpenIcon, "assets/minus.png");
	registClassStyle(tree, disclosureClosedIcon, "assets/plus.png");
}

private static function registClassStyle(component:UIComponent, clazz:Class, value:String):void {
	if(clazz["loader"].content == null){
		clazz["loader"].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void {
			component.setStyle(getQualifiedClassName(clazz), clazz);
		});
		clazz["loader"].load(new URLRequest(value), new LoaderContext(true));
	}
}


如果想全局注册,可以考虑下面的代码:

private static function registTreeDisclosureIcon():void {
	var css:CSSStyleDeclaration = StyleManager.getStyleDeclaration("Tree");
	registClassStyle(css, disclosureOpenIcon, "assets/minus.png");
	registClassStyle(css, disclosureClosedIcon, "assets/plus.png");
}

private static function registClassStyle(css:CSSStyleDeclaration, clazz:Class, value:String):void {
	if(clazz["loader"].content == null){
		clazz["loader"].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void {
			css.setStyle(getQualifiedClassName(clazz), clazz);
		});
		clazz["loader"].load(new URLRequest(value), new LoaderContext(true));
	}
}

 
最后看看摆脱mx.controls.Tree的FastTree怎么定制展开合并图标,比如下面的代码就让展开合并图标颠倒了:

tree4.expandIcon = "collapsed_icon";
tree4.collapseIcon = "expanded_icon";


本文完整代码见附件:见原文最下方

 

分享到:
评论

相关推荐

    TWaver_Flex中文帮助文档

    TWaver Flex中的告警功能是该组件的一个重要组成部分,文档中讲解了告警的使用,包括告警级别、状态与统计、以及告警的呈现方式。 ### 版权声明和使用许可 文档中也明确了版权信息和版权声明,强调了文档是...

    flex Twaver组件使用

    它可以驱动多个视图,如`twaver.controls.Tree`、`twaver.controls.Table`和`twaver.network.Network`。当`DataBox`中的数据发生变化时,这些变化会自动反映到与其关联的所有视图组件上,实现了数据和视图的双向绑定...

    twaver flex 中文用户使用手册

    《Twaver Flex中文用户使用手册》是一份专为使用Twaver Flex产品的用户准备的详尽指南,旨在帮助用户深入理解和高效应用这款强大的图形化建模工具。Twaver Flex是一款基于Adobe Flex技术的可视化开发框架,它提供了...

    twaver.js使用示例

    可能是用于展示如何在twaver.js中处理警报或事件管理的实例。通过这个文件,我们可以学习到如何利用twaver.js来设计和实现报警系统的图形界面,包括节点的动态更新、状态显示、事件触发等。 **综合知识点:** 1. *...

    TWaver的3d图形组件库,小demo

    通过这个"TWaver的3d图形组件库,小demo",开发者不仅可以学习到如何使用TWaver库创建3D图形,还能了解到现代Web开发中的3D数据可视化技术和最佳实践。通过研究提供的源代码,开发者可以提升自己在WebGL和JavaScript...

    TWaver HTML5 Developer Guide

    Tree组件章节中,开发者将学习到如何定义树节点的样式,以及如何控制树的层次结构和排序,实现复杂的树形结构。 Table组件章节讲解了表格的列设置以及数据排序方法。 Chart组件章节介绍了多种图表组件的使用方法,...

    twaver-html5-5.9.0-api_html5_-5.9.0-api_twaver_

    标题中的"twaver-html5-5.9.0-api_html5_-5.9.0-api_twaver_"似乎是指一个基于HTML5的Twaver版本5.9.0的应用程序接口(API)文档。Twaver是一个强大的数据可视化和网络建模工具,广泛应用于网络拓扑、流程图、组织...

    twaver for flex 开发手册

    - **Tree 组件**:用于展示层级结构的数据,支持折叠/展开树节点等功能。 #### 五、TWaverFlex 数据模型详解 TWaverFlex 的数据模型主要由以下几种数据元素组成: - **基本数据元素**:包括 twaver.Node 和 ...

    TWaver Documents中文文档

    TWaver Documents中文文档

    TWaver-java-4.1最新 官网试用版jar包及Demo

    【描述】描述中的“TWaver-java-4.1最新 官网试用版jar包及Demo”表明这是一个Java开发的工具包,主要功能在于提供数据可视化的解决方案。用户可以通过试用版的jar包进行初步体验,同时附带的Demo则能够帮助开发者更...

    TWaver_Web_4.0中文开发手册

    - **前台 Table 组件**、**前台 Tree 组件**、**前台 Sheet 组件**、**前台 AlarmTable**、**前台 AlarmOverview 组件** 等章节详细介绍了如何将 TWaver Web 的功能与 ExtJS 的各种组件集成,以实现复杂的应用场景。...

    twaver web实例源码

    【描述】"twaver web结合extjs源码学习资料"意味着这个压缩包包含了一组实际项目的源代码,用于展示如何在Web环境中整合Twaver和ExtJS。通过学习这些源码,开发者可以深入了解这两个库如何协同工作,创建交互式和...

    TWaver HTML5 开发指南代码

    通过学习和研究这些代码,开发者可以快速掌握TWaver的用法,将其应用到实际项目中。 综上,TWaver HTML5开发指南代码是开发人员构建高效、互动的拓扑工具和机房展示应用的重要资源,它简化了HTML5环境下的可视化...

    TWaver文档

    - 这种跨平台的支持意味着TWaver可以被集成到不同的应用场景中,无论是桌面应用、Web应用还是移动应用,都能找到合适的版本。 ### TWaver的优势 #### 高效性 - TWaver在处理大量数据时表现出了极高的效率,例如在*...

    Twaver-html5.zip

    Twaver学习案例的例子

    twaver-java-4.1

    【标题】"TWaver-java-4.1" 是一个针对Java平台的TWaver最新开发包,旨在帮助开发者创建更加生动且具有吸引力的用户界面。TWaver是一个强大的数据可视化工具,它提供了丰富的图表类型和交互功能,让数据展示更加直观...

    Twaver 3.7性能测试报告

    - **随机连接测试**中,随着节点数量及连接复杂度的增加,Twaver Java表现出良好的扩展性,能够有效管理大量数据和复杂逻辑关系,这为实际应用中的高并发场景提供了有力支撑。 - **特定比例连接测试**进一步验证了...

Global site tag (gtag.js) - Google Analytics