您的位置:首页 > 其它

TableCellRenderer用法实践(2)定制JTableHeader

2009-08-17 19:50 225 查看
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;   
    }   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: