我们在设置jtree的样式的时候,一般都用DefaultTreeCellRenderer这个类进行构造。
基本代码:
Jtree tree=new Jtree();
DefaultTreeCellRenderer ren=new DefaultTreeCellRenderer();
ren.setBackgroundSelectionColor(Color newColor);//选中的时候背景颜色什么的。
tree.setCellRenderer(ren);//设置tree的颜色
但是这只是针对于选中,不选中。或者整体的tree的样式的调节。很死板,不能单独对一个节点进行样式的改变。
我们在来看看这个类,DefaultTreeCellRenderer。这个类实际上是实现的接口TreeCellRenderer,这个接口有个方法:
Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus)
将当前树单元格的值设置为
value
。如果
selected
为 true,则将单元格作为已选择的单元格进行绘制。如果
expanded
为 true,则当前扩展该节点,如果
leaf
为 true,则该节点表示叶节点,如果
hasFocus
为 true,则该节点当前拥有焦点。
tree
是为其配置接收者的
JTree
。返回渲染器用来绘制值的
Component
。
我们可以写一个新类继承这个 DefaultTreeCellRenderer类。然后覆写这个方法。最终可以实现单个单个节点tree的样式的设置。
class MyTreeCellRenderer extends DefaultTreeCellRenderer {
private final TreeCellRenderer renderer;
public String key;
public MyTreeCellRenderer(TreeCellRenderer renderer,String key) {
this.renderer = renderer;
this.key=key;
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded,boolean leaf, int row, boolean hasFocus) {
JComponent c = (JComponent) renderer.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
if (isSelected) {
c.setOpaque(false);//设置该组件边缘像素不可编辑
c.setForeground(getTextSelectionColor());
} else {
c.setOpaque(true);
if (key!=null && !key.isEmpty() &&
value.toString().toLowerCase().startsWith(key.toLowerCase())) {//如果以该关键字开头的
c.setForeground(getTextNonSelectionColor());
c.setBackground(Color.YELLOW);//则设置黄颜色作为高亮
} else {
c.setForeground(getTextNonSelectionColor());
c.setBackground(getBackgroundNonSelectionColor());
}
}
return c;
}
}
主类:
public class HighTest {
public static void main(String[] args) {
//整体窗口的使用
final JFrame jFrame=new JFrame("我的第一个窗体");
jFrame.setSize(new Dimension(800, 500));//设置窗体的大小
jFrame.setBackground(Color.BLACK);
jFrame.setLocation(new Point(300, 300));//设置窗体显示的位置
jFrame.setVisible(true);
jFrame.setLayout(new FlowLayout());
jFrame.addWindowListener(new WindowAdapter() {//加入关闭窗体事件
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("系统正在关闭");
System.exit(0);
}
});
DefaultMutableTreeNode color = new DefaultMutableTreeNode( " Color ");//设置一个tree的根节点color
DefaultMutableTreeNode gray = new DefaultMutableTreeNode ( " Gray " );//设置另一个节点gray
color.add (gray);//把Gary加入到color
//设置各个节点子类、父类关系
DefaultMutableTreeNode red=new DefaultMutableTreeNode ( " Red " );
color.add (red );
DefaultMutableTreeNode Lightgray=new DefaultMutableTreeNode ( " Lightgray " );
gray.add (Lightgray );
DefaultMutableTreeNode Darkgray=new DefaultMutableTreeNode ( " Darkgray " );
gray.add (Darkgray );
DefaultMutableTreeNode Green=new DefaultMutableTreeNode ( " Green " );
color.add ( Green);
JTree example5 = new JTree (color);//初始化jtree,把根节点color传入
example5.addTreeSelectionListener(new SelectNodeHandle(example5));
example5.addMouseListener(new SelectNodeHandle(example5));
example5.setCellRenderer(new MyTreeCellRenderer(e
xample5.getCellRenderer()," Lightgray "));
//
getCellRenderer通过这个方法可以取得
TreeCellRenderer一个接口对象,“
Lightgray
”就是关键字,这个相当于调用新类的构造方法
jFrame.add(example5);//加入jframe面板
}
}