jtree相关的getTreeCellRendererComponent方法的使用

我们在设置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面板
}
}

 

猜你喜欢

转载自747017186.iteye.com/blog/2121615