12.10.4 使用DefaultTreeCellRenderer改变节点外观
12.10.4 使用DefaultTreeCellRenderer改变节点外观
对比图12.38和图12.41所示的两棵树,不难发现图12.38所示的树更美观,因为图12.38所示的树节点的图标非常丰富,而图12.41所示的树节点的图标太过于单一
实际上,JTree
也可以改变树节点的外观,包括改变节点的图标、字体等,甚至可以自由绘制节点外观。为了改变树节点的外观,可以通过为树指定自己的CellRenderer
来实现,JTree
默认使用DefaultTreeCelIRenderer
来绘制每个节点。DefaultTreeCellRenderer
是JLabel
的子类,该JLabel
包含了该节点的图标和文本。
如何改变树节点的外观样式
改变树节点的外观样式,可以有如下三种方式。
- 使用
DefaultTreeCellRenderer
直接改变节点的外观,这种方式可以改变整棵树所有节点的字体颜色和图标 - 为
JTree
指定DefaultTreeCellRenderer
的扩展类对象作为JTree
的节点绘制器,该绘制器负责为不同节点使用不同的字体、颜色和图标。通常使用这种方式来改变节点的外观。 - 为
JTree
指定一个实现TreeCellRenderer
接口的节点绘制器,该绘制器可以为不同的节点自由绘制任意内容,这是最复杂但最灵活的节点绘制器。
使用DefaultTreeCellRenderer
直接改变节点的外观
第一种方式最简单,但灵活性最差,因为它会改变整棵树所有节点的外观。在这种情况下,JTree
的所有节点依然使用相同的图标,相当于整体替换了JTree
中节点的所有默认图标。用户指定的节点图标未必就比JTree
默认的图标美观。
DefaultTreeCellRenderer
提供了如下几个方法来修改节点的外观
setBackgroundNonSelectionColor(ColorNewColor
:设置用于非选定节点的背景颜色。setBackgroundSelection Color( Color new Color)
:设置节点在选中状态下的背景颜色。set Selection Color( Color newColor)
:设置选中状态下节点的边框颜色。setclosedIcon( Icon newIcon)
:设置处于折叠状态下非叶子节点的图标。setFont( Font font)
:设置节点文本的字体。setleaficon( Icon newSon)
:设置叶子节点的图标。setOpenIcon( con newson)
:设置处于展开状态下非叶子节点的图标。settextNon Selection color( Color new Color)
:设置绘制非选中状态下节点文本的颜色set TextSelection Color( Color new Color)
:设置绘制选中状态下节点文本的颜色
程序 直接使用DefaultTreeCellRenderer
来改变树节点的外观
1 | import java.awt.*; |
上面程序中的粗体字代码创建了一个DefaultTreeCellRenderer
对象,并通过该对象改变了JTree
中所有节点的字体、颜色和图标。运行上面程序,会看到如图12.44所示的效果。
从图12.44中可以看出,JTree
中的所有节点全部被改变了,相当于完全替代了JTree
中所有节点的默认图标、字体和颜色。但所有的叶子节点依然保持相同的外观,所有的非叶子节点也保持相同的外观。这种改变依然不能满足更复杂的需求,例如,如果需要不同类型的节点呈现出不同的外观,则不能直接使用DefaultTreeCellRenderer
来改变节点的外观,可以采用扩展DefaultTreeCellrenderer
的方式来实现该需求。
如何修改展开折叠图标
不要试图通过TreeCellRenderer
来改变表示节点展开/折叠的图标,因为该图标是由Metal
风格决定的。如果需要改变该图标,则可以考虑改变该JTree
的外观风格