# 表格获取勾选行

需求描述:表格下方添加一个按钮,可以实现勾选完后,点击按钮,输出被选中行的信息

参考代码

package com.lys;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CheckboxTableExample extends JFrame {
    private JTable table;
    private JButton button;

    public CheckboxTableExample() {
        setTitle("Checkbox Table Example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(400, 350));

        // 创建表格数据
        Object[][] data = {
                {false, "John Doe", "123 Main St"},
                {false, "Jane Smith", "456 Elm St"},
                {false, "Bob Johnson", "789 Oak St"}
        };

        // 列名
        String[] columnNames = {"Selected", "Name", "Address"};

        // 创建自定义表格模型
        MyTableModel model = new MyTableModel(data, columnNames);

        // 创建带有自定义渲染器和编辑器的表格
        table = new JTable(model) {
            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if (column == 0) { // 第1列使用自定义渲染器
                    return new CheckBoxRenderer();
                }
                return super.getCellRenderer(row, column);
            }

            @Override
            public TableCellEditor getCellEditor(int row, int column) {
                if (column == 0) { // 第1列使用自定义编辑器
                    return new CheckBoxEditor();
                }
                return super.getCellEditor(row, column);
            }
        };

        // 设置表格大小
        table.setPreferredScrollableViewportSize(new Dimension(400, 200));

        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);

        // 创建按钮
        button = new JButton("输出选中行信息");
        button.addActionListener(new ButtonClickListener());

        getContentPane().add(button, BorderLayout.SOUTH);

        pack();
        setLocationRelativeTo(null);
    }

    // 自定义表格模型
    private class MyTableModel extends AbstractTableModel {
        private Object[][] data;
        private String[] columnNames;

        public MyTableModel(Object[][] data, String[] columnNames) {
            this.data = data;
            this.columnNames = columnNames;
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data[rowIndex][columnIndex];
        }

        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 0; // 第1列可编辑
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            data[rowIndex][columnIndex] = aValue;
            fireTableCellUpdated(rowIndex, columnIndex);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return columnIndex == 0 ? Boolean.class : super.getColumnClass(columnIndex);
        }
    }

    // 自定义复选框渲染器
    private class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {

        public CheckBoxRenderer() {
            setHorizontalAlignment(JLabel.CENTER);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setSelected((Boolean) value);
            return this;
        }
    }

    // 自定义复选框编辑器
    private class CheckBoxEditor extends DefaultCellEditor {

        public CheckBoxEditor() {
            super(new JCheckBox());
            JCheckBox checkBox = (JCheckBox) getComponent();
            checkBox.setHorizontalAlignment(JLabel.CENTER);
        }
    }

    // 添加按钮监听器
    private class ButtonClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            StringBuilder selectedRowsInfo = new StringBuilder();
            int rowCount = table.getRowCount();
            for (int i = 0; i < rowCount; i++) {
                boolean selected = (boolean) table.getValueAt(i, 0);
                if (selected) {
                    String name = (String) table.getValueAt(i, 1);
                    String address = (String) table.getValueAt(i, 2);
                    selectedRowsInfo.append("Name: ").append(name).append(", Address: ").append(address).append("\n");
                }
            }
            if (selectedRowsInfo.length() > 0) {
                JOptionPane.showMessageDialog(CheckboxTableExample.this, selectedRowsInfo.toString(), "Selected Rows", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(CheckboxTableExample.this, "No rows selected!", "Selected Rows", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            CheckboxTableExample example = new CheckboxTableExample();
            example.setVisible(true);
        });
    }
}

效果