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();
}
}
});
实现效果: