替换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";


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

 

CT图像预处理必知:如何根据不同器官选择最佳窗宽窗位参数? 本文详细解析了CT图像预处理中窗宽窗位参数的选择策略,针对不同器官如肺部、腹部脏器等提供了最佳参数设置建议。通过实战案例和AI自适应技术,帮助医学影像从业者优化CT图像显示效果,提升诊断准确性。 阅读详情

相关推荐

UVM对象实例化及覆盖的几种方法

UVM对象实例化的方法有多种,以下以object为例: 1)第一种:直接利用new函数进行实例化 trans t1; t1 = new("t1");//利用new函数进行实例化 2)第二种:uvm_component_registry中提供的方法type_id::create,此种方法也是最常使用的方法 trans t2; t2 = trans::type_id::create("t2",this); 3)第三种:uvm_factory中提供的方法creat_object_by_type trans t

沧月九流的博客 3375

Twaver-HTML5基础学习(31)Tree基本使用

Twaver-HTML5基础学习(31)Tree基本使用

见贤思齐焉,见不贤内自省 907

FPGA 高速接口Aurora8B/10B 协议详解与仿真

Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可扩展轻量级链路层协议,为板对板、芯片对芯片以及一些单向链接提供低成本低资源的解决方案。信号源信号描述ref_clk时钟源GT的外部时钟INIT CLK时钟源全局复位,低电平有效DRP CLK时钟源DRP时钟,动态重配置时钟时钟源用户传输的数据钟及逻辑时钟域。

toonyhe的博客 3997

WIN10任务栏隐藏图标的合并及展开问题

1、鼠标移动至任务栏“单击右建”,选择任务栏设置; 2、进入任务栏设置后,选择任务栏; 3、单击任务栏后,选择合并任务栏按钮,再单击选择哪些图标显示在任务栏上 4、单击进入选择哪些图标显示在任务栏上后,单击通知区域所有图标 “关” 5、查看任务栏,任务栏所有图标已隐藏 ...

m0_52514790的博客 4390

ENSP内使用wireshark进行抓包,并且解析icmp报文

前四位:54 89 98 e8 20 38 为ip报文包的mac地址也就是物理地址。一开始进行抓包是没有icmp报文的,需要我们在ensp中使用pc1请求联通pc9。协议编号后分别为:ip版本、ip首部报文长度、服务类型、ip报文总长度。最后为校验和 、源ip地址、目的ip、从08 00开始为真正的数据。我们需要实验的端口为:0/0/4,也就是抓包第三个交换机内的报文。其中显示的icmp报文就是我们需要解析的ip报文。源mac地址后跟着的就是协议编号: 08 00。根据ip报文包的结构我们进行解析。

2301_81713278的博客 2138

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 592

巧用TWaver 3D 矢量图形功能

的确,提起TWaver,大家想到的首先是“电信拓扑图组件”。其实,由于其灵活的MVC架构、矢量化设计、方便定制等特点,TWaver可以做的还有很多。例如房地产行业常见到的“户型图”。

TWaver可视化 2287

【个人记录】CentOS7升级glibc至2.28

由于CentOS7系统已经停止支持, 虽然大部分业务已经迁移至OpenEuler,但仍然有部分业务系统跑在CentOS7上。在尝试部署新业务环境时经常会提示如下错误(以code-server运行需要的node 20为例)node -v为了保障业务可正常运行,通常采用Docker继承好的node环境进行部署,但部分场景还是需要宿主机使用新版glibc版本。本文记录本人一次成功升级glibc(2.17=>2.28)的步骤。

喵呜 3883

减法(minus)的研究

1. 尾数的循环变化比如给学校的一卡通,充值 100.00 元,分辨率在分一级。只有学校的澡堂的扣费是按时间 5 分 5 分地扣费的,最终的尾数(分),只可能在 0/5 之间循环。 尾数是 9、4:9/4 尾数是 8、3:8/3 尾数是 7、2:7/2 尾数是 6、1:6/1 尾数是 5、0:5/0

1938

逆变器、转换器、DCDC、继电器等器件的原理和作用

交流电变成直流电的过程:整流==》滤波==》稳压。

m0_61973119的博客 8028

PCB Layout工程师核心能力与实战进阶指南

PCB Layout是电子硬件从原理图到物理实现的关键环节,本质是将电路逻辑转化为受电磁场、热力学与制造工艺约束的三维空间结构。其设计质量直接决定信号完整性(SI)、电源完整性(PI)和电磁兼容性(EMC)等核心性能指标。随着高速接口(如PCIe Gen5、USB3.2)、高密度封装(BGA微间距、HDI)及车规/工业级可靠性要求提升,Layout已从‘连线’演进为多目标协同优化的系统工程。掌握Altium Designer等EDA工具、理解叠层设计与DFM规则、具备SI/PI仿真意识,并能贯通芯片Data

weixin_42589700的博客 86

QTreeWidget隐藏去掉或更改item项前的展开折叠三角图标

//如果不想要展开折叠图标(三角图标),可以用以下代码 { //隐藏根节点项前的图标(展开折叠图标) ui.treeWidget-&gt;setRootIsDecorated(false); //如果只是隐藏根点的展开折叠图标而子节点保留,则只需要上面语句 ui.treeWidget-&gt;setStyleSheet("QTreeView::branch:has-children:!has-si...

jxbinwd的博客 2万+

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 278

TWaver HTML5学习笔记 —— 拓扑元素添加标签图标

一、学习内容概述:      学习如何在拓扑图中为元素添加标签图标。 二、学习内容总结: 1、添加标签图标的方法:设置节点的“icons.names”属性即可(图片需求提前注册),例如:      lastData.setStyle('icons.names', ["alarm_label"]); 三、验证代码运行效果截图:

Steven的专栏 4569

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TWaver加上了TreeTable

TWaver终于加上了大家盼望已久的TreeTable组件.现在我们可以做告警关联的表格了!TWaver的demo里面有一个文件浏览器的例子,确实展示了TreeTable的作用以及延迟加载的能力.还是到http://demo.servasoft.com跑一下demo看一下实际效果吧!

solo的专栏 2965

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TWaver HTML5之树形布局

今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分为不同的域,比如一级域,二级域,三级域,….N级域,而且不同域之间会有连线。对于这个需求,按照常规的想法,使用group岂不是很简单,一级域是一个group,二级域也是一个group,二级域的group是一级域的父亲,以此类推。但是这样有个问题,如果域比较多,会造成group的过度嵌套,界面中group多了之后,不仅用户体验下降,而且会严重影响性能,所以倒不如直接用树,可以很直观的体现各个域之间的层级关系。

TWaver可视化 4567

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

EasyUI加载树控件自动展开所有目录

在这里如何加载树控件就不在熬述,在加载树控件后,树的节点全部展开,要在OnLoadSuccess事件中写代码: 转载于:https://www.cnblogs.com/luyuwei/p/5280033.html...

weixin_30809173的博客 157

TWaver HTML5学习笔记 —— 选择隐藏网元

一、学习内容概述:      学习如何在拓扑图中动态设置是否显示网元。 二、学习内容总结: 1、实现思路:为拓扑元素定义一个自定义属性hidden,当hidden值为true时,则该拓扑元素不显示。      1)、网元添加自定义属性:    lastData.setClient("hidden", true);      2)、设置拓扑元素是否显示: // 拓扑

Steven的专栏 4782

Flex中给Tree设置ICON图标

利用folderClosedIcon和folderOpenIcon、defaultLeafIcon样式 加上如下代码,可以去掉树控件默认的文件夹图标了。     &lt;mx:Style&gt;         Tree {             folderClosedIcon: ClassReference(null);             folderOpenIcon: Class...

好心情的博客 307

javafx-解决转换成maven项目后报错找不到fxml文件

目录结构 引入fxml public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml")); primaryStage.setTitle("KeDD"); pr

随笔 750

Twaver demo

TWaver中有一个平行四边形的Group对象,适合做上图中的“层”的概念。先如下封装并设置属性: package demo;      import java.awt.Color;   import twaver.Group;   import twaver.TWaverConst;      public class LayerGroup extends Group {   ...

Ljh435870628的专栏 535
上一篇: TWaver网元动态转动效果
下一篇: 让JTextField添加“自动完成”功能
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值