通常來說,使用下面的方法確實能改變樹節(jié)點的圖標,但靈活性不高。
// 設定葉節(jié)點圖標
Icon leafIcon = new ImageIcon(TreeViewPanel.class
.getResource("/leaf.gif"));
// 設定關閉狀態(tài)節(jié)點圖標
Icon closedIcon = new ImageIcon(TreeViewPanel.class
.getResource("/close.gif"));
// 設定打開狀態(tài)節(jié)點圖標
Icon openIcon = new ImageIcon(TreeViewPanel.class
.getResource("/open.gif"));

// 取得樹的渲染器
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
.getCellRenderer();

// 設定葉節(jié)點圖標
renderer.setLeafIcon(leafIcon);

// 設定關閉狀態(tài)節(jié)點圖標
renderer.setClosedIcon(closedIcon);

// 設定打開狀態(tài)節(jié)點圖標
renderer.setOpenIcon(openIcon);
但這樣靈活性不高,如我想每層的圖標都不一樣就不能使用這種方法了,我想要的效果如下:
這時我們只有擴展DefaultTreeCellRenderer創(chuàng)建自己的樹節(jié)點渲染器,我創(chuàng)建的渲染器代碼如下:
package com.sitinspring.common.render;

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;


/** *//**
* 樹節(jié)點渲染器
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-2-12
*/

public class TreeNodeRenderer extends DefaultTreeCellRenderer
{
private static final long serialVersionUID = 8532405600839140757L;
// 數(shù)據(jù)庫圖標,頂層節(jié)點用
private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/database.gif"));
// 表圖標,第三層節(jié)點用
private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/leaf.gif"));
// 表空間關閉狀態(tài)圖標,關閉狀態(tài)的第二層節(jié)點用
private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/close.gif"));
// 表空間關閉狀態(tài)圖標,打開狀態(tài)的第二層節(jié)點用
private static final Icon tableSpaceOpenIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/open.gif"));
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,

boolean hasFocus)
{
super.getTreeCellRendererComponent(tree,
value,
sel,
expanded,
leaf,
row,
hasFocus);
// 取得節(jié)點
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
// 取得路徑
TreeNode[] paths = node.getPath();
// 按路徑層次賦予不同的圖標

if (paths.length == 3)
{
setIcon(tableIcon);

}else if(paths.length == 2)
{
// 按展開情況再賦予不同的圖標

if(expanded)
{
setIcon(tableSpaceOpenIcon);
}

else
{
setIcon(tableSpaceCloseIcon);
}
}

else if(paths.length == 1)
{
setIcon(databaseIcon);
}
return this;
}
}
使用這個渲染器使用以下代碼就行了:
tree.setCellRenderer(new TreeNodeRenderer());
以上。