JTable单元格是由单元格绘制器绘制出来的,这是一些执行TableCellRenderer接口的类。TableCellRenderer接口定义了唯一的getTableCellRendererComponent方法,返回对Component的引用,二Component则用来实现绘图操作。但是因为定义单独的类来执行TableCellRenderer比较方便,而且可以实现绘图操作,所以TablecellRenderer通常只返回对自己的引用。下面是传递给getTableCellRendererComponent()方法的几个参数:
- 对JTable的引用,含有要绘制的单元格
- 对单元格值的引用
- boolean标记,用来表示单元格是否被选中
- boolean标记,用来表示单元格是否为输入焦点
- 绘制的单元格的行索引号
- 绘制的单元格的列索引号
1 public void setTableStyle(JTable table){ 2 //设置表头 的绘制器 3 DefaultTableCellHeaderRenderer headerRender = new DefaultTableCellHeaderRenderer(){ 4 private static final long serialVersionUID = 7012909291394175134L; 5 public Component getTableCellRendererComponent(JTable table, Object value, 6 boolean isSelected, boolean hasFocus, int row, int column) { 7 //绘制单元格的边框 8 setBorder(new MatteBorder(0,1,0,1, new Color(0x1A2730))); 9 setText((value == null) ? "" : value.toString()); 10 setBackground(new Color(0x2d7e89)); 11 setFont(new Font("宋体", Font.PLAIN,15)); 12 return this; 13 } 14 }; 15 headerRender.setHorizontalAlignment(JLabel.CENTER); 16 table.getTableHeader().setDefaultRenderer(headerRender); 17 //设置背景颜色 18 table.getTableHeader().setBackground( new Color(0x2d7e89)); 19 table.getTableHeader().setForeground(Color.white); 20 //设置单元格的绘制器 21 DefaultTableCellRenderer cellRender = new DefaultTableCellRenderer(){ 22 private static final long serialVersionUID = -3807459616324121906L; 23 public Component getTableCellRendererComponent(JTable table, Object value, 24 boolean isSelected, boolean hasFocus, int row, int column) { 25 if (isSelected){ 26 //设置选中时 单元格的颜色 27 setBackground(new Color(0x6EBBCA)); 28 } 29 else { 30 setBorder( new MatteBorder(0,1,0,1, new Color(0x1A2730))); 31 setBackground(new Color(0xDCEBED)); 32 } 33 setText((value == null) ? "" : value.toString()); 34 setFont(new Font("宋体", Font.BOLD,14)); 35 return this; 36 } 37 }; 38 cellRender.setHorizontalAlignment(JLabel.CENTER); 39 cellRender.setForeground(Color.RED); 40 table.setDefaultRenderer(Object.class, cellRender); 41 // 设置表是否绘制单元格周围的网格线。 42 table.setShowGrid(false); 43 //设置表是否绘制单元格之间的水平线 44 table.setShowHorizontalLines(false); 45 table.setBackground(new Color(0xDCEBED)); 46 //设置单元格之间的间距 47 table.setIntercellSpacing(new Dimension(0,0)); 48 49 table.getColumn(colname[colname.length - 1]).setMaxWidth(0); 50 table.getColumn(colname[colname.length - 1]).setMinWidth(0); 51 table.getColumn(colname[colname.length - 1]).setPreferredWidth(0); 52 }
运行结果
通过单元格绘制器,可以设置指定单元格或者指定列指定行的颜色字体,甚至可以根据单元格的值不同,显示不同的颜色等等。
代码示例如下
1 /** 2 * 当编号在5~7之间 设为蓝色 3 * @param table 4 */ 5 public void setTableStyleByID(JTable table){ 6 //设置表头 的绘制器 7 DefaultTableCellHeaderRenderer headerRender = new DefaultTableCellHeaderRenderer(){ 8 private static final long serialVersionUID = 7012909291394175134L; 9 public Component getTableCellRendererComponent(JTable table, Object value, 10 boolean isSelected, boolean hasFocus, int row, int column) { 11 //绘制单元格的边框 12 setBorder(new MatteBorder(0,1,0,1, new Color(0x1A2730))); 13 setText((value == null) ? "" : value.toString()); 14 setBackground(new Color(0x2d7e89)); 15 setFont(new Font("宋体", Font.PLAIN,15)); 16 return this; 17 } 18 };; 19 headerRender.setHorizontalAlignment(JLabel.CENTER); 20 table.getTableHeader().setDefaultRenderer(headerRender); 21 //设置背景颜色 22 table.getTableHeader().setBackground( new Color(0x2d7e89)); 23 table.getTableHeader().setForeground(Color.white); 24 //设置单元格的绘制器 25 DefaultTableCellRenderer cellRender = new DefaultTableCellRenderer(){ 26 private static final long serialVersionUID = -3807459616324121906L; 27 public Component getTableCellRendererComponent(JTable table, Object value, 28 boolean isSelected, boolean hasFocus, int row, int column) { 29 int var = Integer.valueOf(table.getModel().getValueAt(row, 0).toString()); 30 31 if (isSelected){ 32 //设置选中时 单元格的颜色 33 setBackground(Color.BLACK); 34 } 35 else { 36 if (var >=5 && var <=7){ 37 setBackground(Color.BLUE); 38 }else{ 39 setBackground(new Color(0xDCEBED)); 40 } 41 setBorder( new MatteBorder(0,1,0,1, new Color(0x1A2730))); 42 } 43 setText((value == null) ? "" : value.toString()); 44 setFont(new Font("宋体", Font.BOLD,14)); 45 return this; 46 } 47 }; 48 cellRender.setHorizontalAlignment(JLabel.CENTER); 49 cellRender.setForeground(Color.RED); 50 table.setDefaultRenderer(Object.class, cellRender); 51 // 设置表是否绘制单元格周围的网格线。 52 table.setShowGrid(false); 53 //设置表是否绘制单元格之间的水平线 54 table.setShowHorizontalLines(false); 55 table.setBackground(new Color(0xDCEBED)); 56 //设置单元格之间的间距 57 table.setIntercellSpacing(new Dimension(0,0)); 58 59 table.getColumn(colname[colname.length - 1]).setMaxWidth(0); 60 table.getColumn(colname[colname.length - 1]).setMinWidth(0); 61 table.getColumn(colname[colname.length - 1]).setPreferredWidth(0); 62 }
运行结果