swing实现表格复选框表头

1.绘制表头

swing中有专门针对表格单元格的绘制接口,将布尔值渲染成复选框,具体代码如下:

/**
 * Title: CheckBoxHeaderCellRenderer
 * Description: 复选框表头单元格绘制器
 * @author Herrona
 */
public class CheckBoxHeaderCellRenderer extends JPanel implements TableCellRenderer {
	
	JCheckBox cbx = new JCheckBox();
	
	public Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
		boolean checked = (Boolean) value;
		this.add(cbx);
		if(checked) {
			cbx.setSelected(true);
		}else
			cbx.setSelected(false);
        this.setBackground(Color.DARK_GRAY);
        this.setBorder(new TableHeaderBorder());
		return this;
	}
	

}

class TableHeaderBorder extends AbstractBorder 
{
	

	protected Insets editorBorderInsets = new Insets( 1, 0, 1, 0 );


	public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) 
	{
		Graphics2D g2d = (Graphics2D) g.create();
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		g2d.translate( x, y );

		//绘制表头单元的底部水平线(跟网格线颜色一样就可以了)
		g2d.setColor(UIManager.getColor("Table.gridColor"));
		g2d.drawLine( 0, h-5, w-2, h-5 );
		
		//绘制表头单元的右分隔竖线
		__Icon9Factory__.getInstance().getTableHeaderCellSeparator1()
			.draw((Graphics2D)g, w - 4, 0, 4, h);

		g2d.translate( -x, -y );
	}


	public Insets getBorderInsets( Component c ) 
	{
		return editorBorderInsets;
	}
}

2.给某列安装单元格渲染器

下面代码给第一列安装渲染器,并设置默认为不选中。

TableColumn firstCol=table.getColumnModel().getColumn(0);
firstCol.setHeaderValue(false);
firstCol.setHeaderRenderer(new CheckBoxHeaderCellRenderer());

3.实现全选或全不选功能

final JTableHeader header = table.getTableHeader();
 //设置不能改变列的顺序,避免麻烦
header.setReorderingAllowed(false);
 //给表头添加鼠标事件
header.addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e) {
               //获取点击的列索引
		int index = header.columnAtPoint(e.getPoint());
             //获得对应的列模型
		TableColumn col = table.getColumnModel().getColumn(index);
		MyTableModel model = (MyTableModel) table.getModel();
		if(index == 0) {
		    boolean target = false;
	        col.setHeaderValue(!(Boolean) col.getHeaderValue());
		    if((Boolean) col.getHeaderValue() == true) {
		    target = true;
		}
		for(int i=0;i < model.getRowCount();i++) {
				model.setValueAt(target, i, 0);
                               //通知表格更新视图
				model.fireTableCellUpdated(i, 0);
		}
                  //重绘表头
		header.repaint();
	}
}
			
});

实现效果:

复选框表头全选效果

猜你喜欢

转载自blog.csdn.net/qq_42864422/article/details/107676439
今日推荐