替换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图像显示效果,提升诊断准确性。 阅读详情

相关推荐

R语言实战:从Raw Counts到TPM/FPKM的完整转换指南(含代码调试技巧)

本文详细介绍了在R语言环境中将RNA-seq原始计数(raw counts)转换为TPM/FPKM值的完整流程,包含代码实现和常见错误调试技巧。通过具体案例演示如何正确处理基因长度和测序深度因素,实现表达量标准化,为生物信息学分析提供可靠数据基础。特别适合需要进行转录组数据分析的研究人员和实验室技术人员参考。

weixin_28559803的博客 477

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

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

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

机器人动力学与控制学习笔记(一)————机器人控制概述

一、概述 1、机器人控制的目的 对自由运动机器人来说,控制的目的是要控制机器人手端的位置和姿态(以后统一简称为位姿),即所谓位置控制问题。这时希望机器人手端所达到的位置称为期望位置或期望轨迹。期望轨迹可以在机器人任务空间中给出,也可以通过逆运动学关系转化为机器人关节空间中的期望轨迹。期望轨迹通常有两种形式:一种是一个固定位置(即固定点),另一种是一条随时间连续变化的轨迹。自由运动机器人位置控制的目的,是要使机器人手端从任意起始位置出发都能到达期望轨迹。当期望轨迹是固定点时的位置控制称为定...

冰与火的青春的博客 6879

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

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

m0_52514790的博客 4390

2020.12.25丨CRISPResso2安装教程

一个月前接到一个项目,说是做关于CRISPR的编辑效率个性化分析。本来这个分析以前是没有做过的,不过客户发了参考文献。里面流程和命令行都非常清楚,再加上读研期间CRISPR的项目“中道崩殂”,让我对CRiSPR的技术有些执念,便下决心接下来试试。 整个测序分析使用的工具就是CRISPResso,,下面介绍最快捷的安装方式。 首先,CRISPResso只支持python2.X,不支持3.X你需要下载Anaconda或者miniconda,以Miniconda为例: 安装环境: Linux 64-bi

4631

Windows配置CA证书颁发机构+NPS-DCServer

Windows配置证书颁发机构+NPS-DCServer

新时代先锋的博客 3万+

巧用TWaver 3D 矢量图形功能

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

TWaver可视化 2287

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4606

减法(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

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3932

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

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

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

jxbinwd的博客 2万+

【立创EDA-PCB设计基础】1.嘉立创EDA专业版软件安装+PCB基本概念+原理图绘制

本文详解PCB基本概念以及实现MCU最小系统原理图的绘制(原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED)及嘉立创EDA专业版软件安装。为本专栏【立创EDA-PCB设计基础】后面章节实现PCB绘制做准备。

嵌入式阿齐Archie 3万+

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

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

Steven的专栏 4569

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TWaver加上了TreeTable

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

solo的专栏 2965

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TWaver HTML5之树形布局

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

TWaver可视化 4567

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值