# 表格获取勾选行
需求描述:表格下方添加一个按钮,可以实现勾选完后,点击按钮,输出被选中行的信息
参考代码:
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);
});
}
}
效果