表头带有CheckBox可以实现全选的jtable

表的第一列都是checkbox,表头的checkbox可以实现全选和全不选的功能


 

一开始要设置一下tablemodel ,这样boolean会被自动显示成一个checkbox,icon也会被自动显示:

table .setModel(new DefaultTableModel(){
	@Override
	public Class getColumnClass(int c)	{
		Object value = getValueAt(0, c);
		if(value!=null)
			return value.getClass();
		else return super.getClass();
	}
});

然后,先写一个表头的renderer(renderer 里有一个方法返回component,table会把这个component的“样子”画在表格中,只是画出它的样子,这个component是不能用的):

class MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer{

	public MyCheckBoxRenderer () {
		this.setBorderPainted(true);
	}
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		// TODO Auto-generated method stub		
		return this;
	}	
}

然后把它设成表头第一列的renderer(第一列名字叫“select"):

		final MyCheckBoxRenderer check = new MyCheckBoxRenderer();
		table.getColumn("select").setHeaderRenderer(check);

由于表头和表中的Cell不一样,表头是不可编辑的,所以给他添加一个mouselistener才能响应事件:

table.getTableHeader().addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e){
		if(table.getColumnModel().getColumnIndexAtX(e.getX())==0){//如果点击的是第0列,即checkbox这一列
			JCheckBox Checkbox = (JCheckBox)check;
			boolean b = !check.isSelected();
			check.setSelected(b);
			table.getTableHeader().repaint();
			for(int i=0;i<table.getRowCount();i++){
				table.getModel().setValueAt(b, i, 0);//把这一列都设成和表头一样
			}
		}
	}
});

第一列的数据类型是boolean就会被自动显示成一个checkbox

你可能感兴趣的:(checkbox,全选,jtable,表头)