【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 表格渲染器

/**
 * 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 表格事件

/**
 * 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()) { // 勾选,判断是否已经全部勾选,如果是,将header勾选
               		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 { // 取消勾选,将header取消勾选
               		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); // checkBox
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值