JTable中 表头中添加 JCheckBox 全选 功能

源码:
CheckHeaderCellRenderer类

public class CheckHeaderCellRenderer implements TableCellRenderer {
    CheckTableModle tableModel;
    JTableHeader tableHeader;
    final JCheckBox selectBox;

    public CheckHeaderCellRenderer(JTable table) {
        this.tableModel = (CheckTableModle)table.getModel();
        this.tableHeader = table.getTableHeader();
        selectBox = new JCheckBox(tableModel.getColumnName(0));
        selectBox.setSelected(false);
        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();
                    }
                }
            }
        });
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        // TODO Auto-generated method stub
        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;
    }

}

CheckTableModle类
public class CheckTableModle extends DefaultTableModel {

    public CheckTableModle(Vector data, Vector columnNames) {
        super(data, columnNames);
    }

 
    // * 根据类型返回显示空间
    // * 布尔类型返回显示checkbox
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

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

}

测试:TestFrame
public class TestFrame extends JFrame {

    private JPanel contentPane;
    private JTable table;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestFrame frame = new TestFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("CheckBox Table");
        this.setPreferredSize(new Dimension(400, 300));
        // setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        table = new JTable();
        JScrollPane scrollPane = new JScrollPane(table,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        contentPane.add(scrollPane, BorderLayout.CENTER);
        initTable();
        pack();
    }
    
    private void initTable(){
        Vector headerNames=new Vector();
        headerNames.add("全选");
        headerNames.add("下单时间");
        headerNames.add("订单编号");
        headerNames.add("订单详情");
        headerNames.add("订单状态");
        Vector data=this.getData();
        CheckTableModle tableModel=new CheckTableModle(data,headerNames);
        table.setModel(tableModel);
        table.getTableHeader().setDefaultRenderer(new CheckHeaderCellRenderer(table));
    }
    
    /**
     * 获得数据
     * @return
     */
    private Vector getData(){
        Vector data = new Vector();
        Vector rowVector1=new Vector();
        rowVector1.add(false);
        rowVector1.add("AA");
        rowVector1.add("25");
        
        Vector rowVector2=new Vector();
        rowVector2.add(false);
        rowVector2.add("BB");
        rowVector2.add("26");
        
        Vector rowVector3=new Vector();
        rowVector3.add(false);
        rowVector3.add("CC");
        rowVector3.add("1");
        
        data.add(rowVector1);
        data.add(rowVector2);
        data.add(rowVector3);
        
        return data;
    }

}


通过测试,完美实现功能:


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
JTable添加JCheckBox可以通过自定义表格渲染器和编辑器的方式来实现。 首先,我们需要自定义一个表格渲染器,用于将数据项以复选框的形式呈现在表格。我们可以创建一个继承自DefaultTableCellRenderer的类,并在其重写getTableCellRendererComponent方法。在该方法,我们可以根据数据的值设置JCheckBox的选状态,并返回一个标签(JLabel)组件,以显示复选框。 其次,我们还需要自定义一个表格编辑器,用于在用户进行编辑时显示复选框。我们可以创建一个继承自DefaultCellEditor的类,并在其重写构造方法和getCellEditorValue方法。在构造方法,我们可以为JCheckBox添加一个ItemListener,用于响应用户的选行为。在getCellEditorValue方法,我们可以根据JCheckBox的选状态返回相应的值。 最后,我们需要将自定义的渲染器和编辑器应用到JTable的指定列。我们可以通过调用JTable的getColumnModel方法获取表格列模型(TableColumnModel),并调用该模型的getColumn方法获取指定的列。然后,可以分别调用TableColumn的setCellRenderer方法和setCellEditor方法,将自定义渲染器和编辑器应用到该列。 例如: ``` JTable table = new JTable(data, columnNames); // 创建JTable对象,data和columnNames分别表示表格的数据和列名 // 创建自定义渲染器 DefaultTableCellRenderer checkboxRenderer = new DefaultTableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JCheckBox checkBox = new JCheckBox(); checkBox.setSelected((Boolean) value); // 根据数据的值设置复选框的选状态 return checkBox; } }; // 创建自定义编辑器 DefaultCellEditor checkboxEditor = new DefaultCellEditor(new JCheckBox()) { public Object getCellEditorValue() { JCheckBox checkBox = (JCheckBox) editorComponent; return checkBox.isSelected(); // 根据复选框的选状态返回相应的值 } }; // 将自定义渲染器和编辑器应用到指定列 TableColumnModel columnModel = table.getColumnModel(); TableColumn checkboxColumn = columnModel.getColumn(0); // 假设要将复选框应用到第一列 checkboxColumn.setCellRenderer(checkboxRenderer); checkboxColumn.setCellEditor(checkboxEditor); ``` 通过以上步骤,我们就能在JTable的指定列添加JCheckBox,并实现复选框的显示和编辑功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值