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是實現列名顯示圖片
[java] view plaincopyprint?
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();
}
}
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是將列名顯示爲顏色
[java] view plaincopyprint?
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;
}
}
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; } }