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 掉。
我知道說起來好像很理所當然,不過在沒看程式碼的前提下還是很容易錯的。所以在此記錄一下。
相關文章
- 自定義圖示列表
- 自定義View:畫布實現自定義View(折線圖的實現)View
- Win10如何自定義硬碟圖示_win10自定義硬碟圖示的教程Win10硬碟
- 自定義Drawable:實現文字生成圖片
- 自定義drawable實現圓角圖片
- 自定義view實現圓角圖片View
- 安卓自定義View實現圖片上傳進度顯示(仿QQ)安卓View
- FineReport中如何用JavaScript自定義地圖示籤JavaScript地圖
- 『自定義View實戰』—— 仿ios圖示下載viewViewiOS
- 為bootstrap新增更多自定義圖示boot
- .Net Core中自定義認證實現
- UWP中實現自定義標題欄
- 自定義View:自定義屬性(自定義按鈕實現)View
- java使用sshd 實現sftp 自定義顯示目錄JavaFTP
- 小技巧:Flutter如何引用自定義圖示Flutter
- Highcharts 實現自定義匯出圖片
- C中atoi和strcpy的自定義實現
- OpenAPI生成器中實現自定義模板API
- 在Vue3中實現自定義指令Vue
- 關於微信分享自定義標題,說明,圖示基於PHP的功能實現PHP
- 百度地圖API : 自定義標註圖示地圖API
- 如何實現OSM地圖本地釋出並自定義配圖地圖
- Net 實現自定義Aop
- EventSource的自定義實現
- 微信分享自定義實現
- vue中elementUI的表格實現自定義編輯VueUI
- vue自定義指令擷取圖片中心顯示Vue
- 【HTML】HTML自定義網頁頭部小圖示HTML網頁
- Dynamics CRM 為案例起源設定自定義圖示
- SpringBoot中搭配AOP實現自定義註解Spring Boot
- Java可自定義中斷定時器的實現Java定時器
- Silverlight及WPF中實現自定義BusyIndicatorIndicator
- 自定義SpringMVC部分實現SpringMVC
- Android自定義拍照實現Android
- Flutter自定義Banner的實現Flutter
- Flutter自定義View的實現FlutterView
- 自定義實現Complex類
- 自定義view實現半圓環View