JTableHeader是管理JTable列头的对象,有方法可以设置默认渲染器(在TableColumn未设置渲染器的情况下)public void setDefaultRenderer(TableCellRenderer defaultRenderer) 。这样为JTableHeader设置渲染器可以绘制出自己想要的效果来显示列头。还可以通过TableColumn来设置每一列的渲染器,以达到不同列具有不同的渲染效果。在生成JTable时会使用默认的数据模型DefaultTableModel,这样通过调用toString()方法,就会将输入的列名数组Object[] columnNames中的元素转化为String类型。所以就不可能实现根据列名类型的不同,执行相应的操作,例如,不可能使列名元素类型的Color的列,在列标题上显示相应的颜色。所以要实现定制JTableHeader,步骤如下:
1.根据要实现的效果实现TabelCellRenderer。
2.用表内容,列名初始化JTable后,用上述两种方法(JTableHeader,TableColumn)设
置列头的渲染器。
3.调用TableColumn的setHeaderValue()方法,重新设置每一列的列名。
下面是两个例子,1是实现列名显示图片,2是将列名显示为颜色
1是实现列名显示图片
import java.awt.*; import javax.swing.*; import javax.swing.table.*; class IconHeaderCellRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return (JLabel)value;//由于列名元素的类型为JLabel,直接返回即可 } } public class IconTableHeader extends JFrame{ private Object cells[][] = { { "one", "1" }, { "two", "2" }, { "three", "3" } }; private String colName[] = { "1", "2" }; private JTable table; public IconTableHeader(){ this.setTitle("IconTableHeader"); table=new JTable(cells,colName); Icon[] colIcon=new Icon[colName.length]; colIcon[0]=new ImageIcon("1.gif"); colIcon[1]=new ImageIcon("2.gif"); JLabel[] colLabel=new JLabel[colName.length]; for(int i=0;i<colName.length;i++){ colLabel[i]=new JLabel(colName[i], colIcon[i], JLabel.CENTER); //将JLabel的边框设置为TabelHeader的边框 colLabel[i].setBorder(UIManager.getBorder("TableHeader.cellBorder")); } IconHeaderCellRenderer renderer=new IconHeaderCellRenderer(); TableColumnModel colModel=table.getColumnModel(); for(int i=0;i<colModel.getColumnCount();i++){ //设置每一列的渲染器,然后为列名重新赋值 colModel.getColumn(i).setHeaderRenderer(renderer); colModel.getColumn(i).setHeaderValue(colLabel[i]); } this.add(new JScrollPane(table),BorderLayout.CENTER); this.setSize(300, 150); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) { new IconTableHeader(); } }
2是将列名显示为颜色
import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class ColorTableHeaderTest { public static void main(String[] args) { new ColorTableHeaderFrame(); } } class ColorTableHeaderFrame extends JFrame { private JTable table; private Object[][] cells=new Object[][]{ { "one", "1" }, { "two", "2" }, { "three", "3" } }; private String[] columnNames=new String[]{"red","yellow"}; public ColorTableHeaderFrame(){ table=new JTable(cells,columnNames); TableColumnModel colModel=table.getColumnModel(); //设置列标题的渲染器,并重新赋值 ColorTableHeaderRenderer renderer=new ColorTableHeaderRenderer(); table.getTableHeader().setDefaultRenderer(renderer); colModel.getColumn(0).setHeaderValue(Color.RED); colModel.getColumn(1).setHeaderValue(Color.YELLOW); add(new JScrollPane(table),BorderLayout.CENTER); setVisible(true); setSize(300,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ColorTableHeaderRenderer extends JLabel implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Color color=(Color)value; setText(" ");//标签无内容,也不会显示标题 setBackground(color); setOpaque(true);//很重要,设置此组件为不透明,不设置就不会显示, setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置使具有列标题的边框 return this; } }