替换TWaver中Tree展开合并图标

2024-02-10 05:58

本文主要是介绍替换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中Tree展开合并图标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696296

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应