`

ASwing 中 JTree 实现 folder 自定义图标

阅读更多

最近在用 ASwing 做项目,需要根据节点内容自定义 folder 的图标。网上找到一些例子但总有各种各样的问题,于是通过查看 ASwing 的代码,实现了这个简单的功能。在这里跟大家分享,也记录一下比较容易错的几个点。

 

首先说一下ASwing渲染的结构。



 

大概的结构就是这样,最后每个节点的渲染是在 TreeCell 中提供图标的。所以实现功能只需要自定义一个自己的 TreeCell 子类。下面是代码:

package {
	import org.aswing.Icon;
	import org.aswing.tree.DefaultTreeCell;
	import org.aswing.tree.MutableTreeNode;
	
	/**
	 * @author dengyang
	 */
	public class MyTreeCell extends DefaultTreeCell{
	
		private var squareIcon:Icon;
		private var dotIcon:Icon;
		
		public function MyTreeCell(){
			super();
			if(squareIcon == null) {
				squareIcon = new SquareIcon();
			}
			if(dotIcon == null) {
				dotIcon = new DotIcon();
			}
		}
			
		override public function setCellValue(value:*) : void {
			super.setCellValue(value);
			//根据此Cell的值,如果最后一个字符数字是偶数,则使用方形图标
			//否则使用圆形图标
			var node:MutableTreeNode = MutableTreeNode(value);
			var str:String = node.getUserObject();
			if(str == '德州扑克'){
				expanded_folder_icon = dotIcon;
				collapsed_folder_icon = dotIcon;
			}else{
				expanded_folder_icon = squareIcon;
				collapsed_folder_icon = squareIcon;
			}
		}	
	}
}

import org.aswing.ASColor;
import org.aswing.Component;
import org.aswing.Icon;
import org.aswing.graphics.Graphics2D;
import org.aswing.graphics.SolidBrush;

import flash.display.DisplayObject;
import flash.display.Sprite;

class SquareIcon implements Icon{
	
	[Embed(source="dz.png")]
	private var dzpng : Class;
	private var dzIcon : DisplayObject;
	
	public function SquareIcon(){
		if(dzIcon == null) {
			dzIcon = new dzpng();
		}
	}
	
	public function getIconWidth(c:Component):int{
		return 16;
	}
	
	public function getIconHeight(c:Component):int{
		return 16;
	}
	
	public function updateIcon(c:Component, g:Graphics2D, x:int, y:int):void{
		g.fillRectangle(new SolidBrush(ASColor.GREEN), x, y, 12, 12);
	}
	
	public function getDisplay(c:Component):DisplayObject{
		return dzIcon;
	}
}


class DotIcon implements Icon{
	
	[Embed(source="dz.png")]
	private var dzpng : Class;
	
	[Embed(source="lock.png")]
	private var lockPng : Class;
	
	private var dzIcon : Sprite;
	
	public function DotIcon(){
		if(dzIcon == null) {
			dzIcon = new Sprite();
			dzIcon.addChild(new dzpng());
			dzIcon.addChild(new lockPng());
		}
	}
	
	public function getIconWidth(c:Component):int{
		return 16;
	}
	
	public function getIconHeight(c:Component):int{
		return 16;
	}
	
	public function updateIcon(c:Component, g:Graphics2D, x:int, y:int):void{
		g.fillCircle(new SolidBrush(ASColor.RED), x+6, y+6, 6);
	}
	
	public function getDisplay(c:Component):DisplayObject{
		return dzIcon;
	}
}

 

代码很简单,但却很容易错。我就错了两次。

起初我在每一个 getDisplay() 中都 new Icon(),造成树上的图标会有残影;后来我在 getDisplay() 中返回 static 的 Icon,同类图表中只有最后一个显示。

 

后来看了一下 DefaultTreeCell 父类 JLabel 中的 setIcon() ,其中有两个操作,一个是 uninstallIcon ,一个是 installIcon。如果每次都 new 新的对象会造成 uninstallIcon 中无法 remove 上次加载的 icon。而如果是静态变量的话,又会造成每次加入新的 Cell 时会把原有 icon remove 掉。

 

我知道说起来好像很理所当然,不过在没看代码的前提下还是很容易错的。所以在此记录一下。

  • 大小: 28 KB
分享到:
评论

相关推荐

    ASWing实现中拖放

    ASWing实现中拖放是一项在图形用户界面(GUI)编程中常见的功能,它允许用户通过鼠标操作将一个对象从一处拖动到另一处,从而实现数据或组件的转移。ASWing是一个开源的Java库,它扩展了Swing框架,提供了更多的功能...

    aswing组件知识点

    在AsWing中,通过实现`TableCellFactory`可以自定义单元格的渲染逻辑。例如,可以创建一个`GeneralTableCellFactory`来统一管理所有单元格的渲染器。这种方式提高了代码的复用性,同时也方便了单元格样式的统一管理...

    ASWING教程

    - **DragAndDrop功能**:介绍如何在AsWing中实现拖拽功能,以提高用户交互体验。 #### 11. 自定义观感 - **LookAndFeel**:指导如何定制界面的外观和感觉,使其更加符合项目的风格。 #### 12. 可视化工具Gui...

    AsWing AEON 皮肤实例

    在AsWing中,皮肤(Skin)是界面外观的核心组成部分,它决定了应用程序的图标、颜色方案、布局以及其他UI元素的样式。更换皮肤可以让应用根据用户的偏好或品牌需求呈现出不同的风格。Aeon皮肤以其简洁明快的设计理念...

    aswing2.0 src

    1. 熟悉ASwing的内部实现,理解组件的工作原理。 2. 自定义组件,满足特定业务需求。 3. 优化性能,例如减少内存占用,提升渲染速度。 4. 更好地集成第三方库或自有的代码。 5. 快速修复发现的问题,无需等待库的...

    AsWing UI源码

    【AsWing UI源码】是一个面向AS3(ActionScript 3)开发者的UI库,提供了丰富的用户界面组件和工具,旨在简化AS3中的图形用户界面(GUI)开发。这个库不仅包含了完整的源代码,还附带了GUI编辑器,方便开发者设计和...

    Aswing皮肤制作

    在这个教程中,我们将深入探讨Aswing皮肤的工作原理,以及如何通过一系列步骤来设计和应用自定义皮肤。 首先,理解Aswing皮肤的基础是关键。Aswing的皮肤主要由两部分组成:外观(LookAndFeel)和组件样式...

    asWing知识点

    - **JPanel**:在AsWing中,`JPanel`扮演着一个非常重要的角色,作为容器组件,它能够容纳其他GUI组件。在设置`JPanel`时,可以通过`setOpaque(boolean opaque)`方法来控制面板是否透明。 ### 2. JWindow与AsWing...

    Flash9下as3.0编程的aswing包

    使用ASwing,开发者可以实现以下功能: 1. 创建窗口(Window):模拟Java Swing中的JFrame,为应用程序提供一个容器来展示组件。 2. 组件(Component):提供各种UI组件,如Button、Label、TextArea等,可以自定义...

    aswing 帮助文档

    AS3的aswing帮助文档! AS3的程序员必备物品。。详细的介绍哦

    aswing1.5+skinbuilder

    在 ASwing 中,皮肤通常包含颜色、字体、边框和图标的定义,可以是XML或者CSS格式,这使得非程序员也能参与到界面设计中来。 在提供的文件中,`library.swf` 可能是一个包含预定义皮肤元素的Flash库文件。SWF 文件...

    aswing API

    aswing API,与AsWing Book.pdf一起使用

    aswing 学习资料

    在 Flash Builder 4 中运行 ASwing 应用程序,首先需要确保已经安装了 Flash Builder 4,并且在项目中引入了 ASwing 相关的库文件。这通常通过添加外部库或使用 SWC 文件来完成。在 Flash Builder 4 的项目设置中,...

    初学aswing学习实用例子

    6. **图形和动画**:ASwing允许开发者使用Graphics类进行绘图,创建自定义组件或实现动画效果。了解基本的绘图命令,如drawRect、drawCircle等,以及如何使用Tween类制作平滑的动画。 7. **项目配置与构建**:在`....

    aswing更换皮肤实例2011

    1. **选择或创建皮肤**:你可以从ASwing库中选取已有的皮肤,或者根据项目需求自定义新的皮肤。皮肤通常以XML文件的形式存在,其中包含了组件各个部分的定义和样式信息。 2. **导入皮肤到Flash CS5.5**:在Flash中...

    aswing_a3_1.3.2_allinone

    在1.3.2这个版本中,我们可以预期开发者已经对ASwing_A3进行了大量的测试和改进,以提供更稳定、高效和易用的开发体验。 这个"allinone"的后缀可能意味着这个压缩包包含了ASwing_A3的全部组件、库、文档和示例,...

    aswing flash ui编程的利器

    1. **组件库**:ASwing提供了丰富的组件集合,如按钮、文本框、面板、表格、菜单等,这些组件设计灵活,易于扩展和自定义。开发者可以根据需求调整组件的外观和行为,实现个性化的设计。 2. **事件处理**:类似于...

    AsWing Book.pdf

    AsWing Book.pdfAsWing Book.pdfAsWing Book.pdfAsWing Book.pdf

    Flash之pureMVC,aswing框架Libs文件

    标题中的“Flash之pureMVC,aswing框架Libs文件”指的是两个主要的ActionScript库:PureMVC和AsWing。这两个库都是为在Adobe Flash环境中开发富互联网应用程序(RIA)而设计的,尤其在Flex框架下使用广泛。下面将详细...

Global site tag (gtag.js) - Google Analytics