【swing】Jtable表头及表格加CheckBox
一、表头渲染器
public class CheckHeaderCellRenderer implements TableCellRenderer {
CheckTableModle tableModel;
JTableHeader tableHeader;
JCheckBox selectBox;
public CheckHeaderCellRenderer(JTable table) {
this.tableModel = (CheckTableModle) table.getModel();
this.tableHeader = table.getTableHeader();
selectBox = new JCheckBox(tableModel.getColumnName(0));
selectBox.setSelected(true);
tableHeader.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 0) {
int selectColumn = tableHeader.columnAtPoint(e.getPoint());
if (selectColumn == 0) {
boolean value = !selectBox.isSelected();
selectBox.setSelected(value);
tableModel.selectAllOrNull(value);
tableHeader.repaint();
}
}
}
});
}
public void setSelectBox(boolean value) {
selectBox.setSelected(value);
tableHeader.repaint();
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String valueStr = (String) value;
JLabel label = new JLabel(valueStr);
label.setHorizontalAlignment(SwingConstants.CENTER);
selectBox.setHorizontalAlignment(SwingConstants.CENTER);
selectBox.setBorderPainted(true);
JComponent component = (column == 0) ? selectBox : label;
component.setForeground(tableHeader.getForeground());
component.setBackground(tableHeader.getBackground());
component.setFont(tableHeader.getFont());
component.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return component;
}
}
二、自定义表模型
public class CheckTableModle extends DefaultTableModel {
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
if (column == 1 || column == 2) {
return false;
} else {
return true;
}
}
public CheckTableModle() {
super();
}
public void selectAllOrNull(boolean value) {
for (int i = 0; i < getRowCount(); i++) {
this.setValueAt(value, i, 0);
}
}
}
三、JCheckBox 表格渲染器
class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
private static final long serialVersionUID = 1L;
Border border = new EmptyBorder(1, 2, 1, 2);
public CheckBoxRenderer() {
super();
setOpaque(true);
setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (value instanceof Boolean) {
setSelected(((Boolean) value).booleanValue());
setForeground(table.getForeground());
setBackground(table.getBackground());
}
return this;
}
}
四、JCheckBox 表格事件
class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
private static final long serialVersionUID = 1L;
protected JCheckBox checkBox;
public CheckBoxCellEditor() {
checkBox = new JCheckBox();
checkBox.setHorizontalAlignment(SwingConstants.CENTER);
checkBox.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
table.editCellAt(-1, -1);
if (checkBox.isSelected()) {
int count = 0;
for (int rowNo = 0; rowNo < table.getRowCount(); rowNo++) {
Boolean cbx = (Boolean) table.getValueAt(rowNo, 0);
if (cbx) count ++;
}
if (count == table.getRowCount())
checkHeaderCellRenderer.setSelectBox(true);
} else {
checkHeaderCellRenderer.setSelectBox(false);
}
}
});
}
@Override
public Object getCellEditorValue() {
return Boolean.valueOf(checkBox.isSelected());
}
@Override
public Component getTableCellEditorComponent(
JTable table,
Object value,
boolean isSelected,
int row,
int column) {
checkBox.setSelected(((Boolean) value).booleanValue());
return checkBox;
}
}
五、使用
JTable table = new JTable();
CheckHeaderCellRenderer checkHeaderCellRenderer;
DefaultTableModel model = new CheckTableModle();
JScrollPane scrollPane = new JScrollPane(table);
String[][] data;
String[] tableTitle = { "", "序号", "序列号", "操作" };
table.putClientProperty("terminateEditOnFocusLost", true);
table.getTableHeader().setReorderingAllowed(false);
model.setDataVector(data, tableTitle);
table.setModel(model);
checkHeaderCellRenderer = new CheckHeaderCellRenderer(table);
table.getTableHeader().setDefaultRenderer(checkHeaderCellRenderer);
table.getColumnModel().getColumn(0).setCellEditor(new CheckBoxCellEditor());
table.getColumnModel().getColumn(0).setCellRenderer(new CheckBoxRenderer());
table.setValueAt(true, count, 0);