Table中的JCheckBox TableHeader的全选(全反选)功能

本文介绍了一个使用Java Swing实现带有复选框表头的表格案例,通过自定义模型CheckDefaultModel和渲染器TableHeaderRender,实现了表格第一列的复选框选择功能,并能通过点击表头复选框实现全选或全不选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

菜鸟学习ing

 

class CheckDefaultModel extends DefaultTableModel

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Test2;

import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Administrator
 */
public class CheckDefaultModel extends DefaultTableModel {

    Object[] columns;
    Object[][] data ;

    public CheckDefaultModel(Object[][] data, Object[] columnNames) {
        super(data, columnNames);
    }

    public Class<?> getColumnClass(int columnIndex) {
        return getValueAt(0, columnIndex).getClass();
    }

    public void setAllSelected(boolean value) {
        for (int i = 0; i < getRowCount(); i++) {
            this.setValueAt(value, i, 0);
        }
    }
}


 

 

class TableHeaderRender implements TableCellRenderer

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Test2;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Administrator
 */
public class TableHeaderRender implements TableCellRenderer {

    JTable table;
    JTableHeader tableHeader;
    CheckDefaultModel model;
    JCheckBox headerBox;

    public TableHeaderRender(JTable table) {
        this.table = table;
        this.tableHeader = table.getTableHeader();
        this.model = (CheckDefaultModel) table.getModel();

        headerBox = new JCheckBox(model.getColumnName(0));
        headerBox.setSelected(false);

        tableHeader.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int selectColumn = tableHeader.columnAtPoint(e.getPoint());
                if (selectColumn == 0) {
                    boolean value = !headerBox.isSelected();
                    headerBox.setSelected(value);
                    model.setAllSelected(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);
        JComponent component = (column == 0) ? headerBox : label;
        return component;
    }
}


 

 

 

 

class TableTester extends JFrame

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Test2;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 *
 * @author Administrator
 */
public class TableTester extends JFrame {

    JPanel contentPanel = new JPanel();
    JTable table = new JTable();
    Object[] columns = {"choose"};
    Object[][] data = {{new Boolean(true)}, {new Boolean(false)}, {new Boolean(false)}};

    public TableTester() {
        setTitle("CheckBox Table2");
        setPreferredSize(new Dimension(300, 200));
        setLocationRelativeTo(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();

        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPanel.setLayout(new BorderLayout());
        add(contentPanel, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        contentPanel.add(scrollPane, BorderLayout.NORTH);

        initTable();
    }

    public void initTable() {
        
        table.setModel(new CheckDefaultModel(data, columns));
        table.getTableHeader().setDefaultRenderer(new TableHeaderRender(table));
    }

    public static void main(String[] args) {
        new TableTester().setVisible(true);
    }
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值