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();
}
}
});
實作效果: