通常来说,使用下面的方法确实能改变树节点的图标,但灵活性不高。
//
设定叶节点图标
Icon leafIcon
=
new
ImageIcon(TreeViewPanel.
class
.getResource(
"
/leaf.gif
"
));
//
设定关闭状态节点图标
Icon closedIcon
=
new
ImageIcon(TreeViewPanel.
class
.getResource(
"
/close.gif
"
));
//
设定打开状态节点图标
Icon openIcon
=
new
ImageIcon(TreeViewPanel.
class
.getResource(
"
/open.gif
"
));
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
取得树的渲染器
DefaultTreeCellRenderer renderer
=
(DefaultTreeCellRenderer) tree
.getCellRenderer();
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
设定叶节点图标
renderer.setLeafIcon(leafIcon);
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
设定关闭状态节点图标
renderer.setClosedIcon(closedIcon);
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
设定打开状态节点图标
renderer.setOpenIcon(openIcon);
但这样灵活性不高,如我想每层的图标都不一样就不能使用这种方法了,我想要的效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/baa46263815f11cfca4424129d47d8e0.jpeg)
这时我们只有扩展DefaultTreeCellRenderer创建自己的树节点渲染器,我创建的渲染器代码如下:
package
com.sitinspring.common.render;
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
import
java.awt.Component;
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
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;
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
/** */
/**
* 树节点渲染器
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-2-12
*/
![](https://i-blog.csdnimg.cn/blog_migrate/1fa987a29c6482f53d401256f96355eb.gif)
public
class
TreeNodeRenderer
extends
DefaultTreeCellRenderer
{
private static final long serialVersionUID = 8532405600839140757L;
// 數據庫圖標,頂層節點用
private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/database.gif"));
// 表圖標,第三層節點用
private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/leaf.gif"));
// 表空間關閉狀態圖標,關閉狀態的第二層節點用
private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/close.gif"));
// 表空間關閉狀態圖標,打開狀態的第二層節點用
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,
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
boolean hasFocus)
{
super.getTreeCellRendererComponent(tree,
value,
sel,
expanded,
leaf,
row,
hasFocus);
// 取得節點
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
// 取得路徑
TreeNode[] paths = node.getPath();
// 按路径层次赋予不同的图标
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
if (paths.length == 3)
{
setIcon(tableIcon);
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
}else if(paths.length == 2)
{
// 按展開情況再賦予不同的圖標
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
if(expanded)
{
setIcon(tableSpaceOpenIcon);
}
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
else
{
setIcon(tableSpaceCloseIcon);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/97e794c86028c5f5b5461ae5ef440a4c.gif)
else if(paths.length == 1)
{
setIcon(databaseIcon);
}
return this;
}
}
使用这个渲染器使用以下代码就行了:
tree.setCellRenderer(
new
TreeNodeRenderer());