java swing如何在JTable一个单元格添加多个复选框
在Java Swing中,要在JTable的单元格中添加多个复选框,可以使用自定义的TableCellRenderer和TableCellEditor。
首先,创建一个自定义的TableCellRenderer类,继承DefaultTableCellRenderer,并重写getTableCellRendererComponent方法。在该方法中,创建多个JCheckBox,并将它们添加到一个容器(例如JPanel)中,然后将该容器作为单元格的渲染组件返回。
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class MultiCheckBoxRenderer extends DefaultTableCellRenderer {
private JPanel panel;
private JCheckBox checkBox1;
private JCheckBox checkBox2;
public MultiCheckBoxRenderer() {
panel = new JPanel();
checkBox1 = new JCheckBox();
checkBox2 = new JCheckBox();
panel.add(checkBox1);
panel.add(checkBox2);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
checkBox1.setSelected(false);
checkBox2.setSelected(false);
// 根据value的值设置选中状态
if (value instanceof Boolean[]) {
Boolean[] values = (Boolean[]) value;
if (values.length > 0) {
checkBox1.setSelected(values[0]);
}
if (values.length > 1) {
checkBox2.setSelected(values[1]);
}
}
return panel;
}
}
然后,创建一个自定义的TableCellEditor类,继承AbstractCellEditor,并实现TableCellEditor接口。在该类中,创建多个JCheckBox,并将它们添加到一个容器(例如JPanel)中,然后将该容器作为单元格的编辑组件返回。
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MultiCheckBoxEditor extends AbstractCellEditor implements TableCellEditor {
private JPanel panel;
private JCheckBox checkBox1;
private JCheckBox checkBox2;
public MultiCheckBoxEditor() {
panel = new JPanel();
checkBox1 = new JCheckBox();
checkBox2 = new JCheckBox();
panel.add(checkBox1);
panel.add(checkBox2);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
checkBox1.setSelected(false);
checkBox2.setSelected(false);
// 根据value的值设置选中状态
if (value instanceof Boolean[]) {
Boolean[] values = (Boolean[]) value;
if (values.length > 0) {
checkBox1.setSelected(values[0]);
}
if (values.length > 1) {
checkBox2.setSelected(values[1]);
}
}
return panel;
}
@Override
public Object getCellEditorValue() {
return new Boolean[]{checkBox1.isSelected(), checkBox2.isSelected()};
}
}
最后,在使用JTable时,将自定义的TableCellRenderer和TableCellEditor分别设置给相应的列。
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("Multiple Checkbox Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel(new Object[][]{
{new Boolean[]{true, false}},
{new Boolean[]{false, true}},
{new Boolean[]{true, true}}
}, new Object[]{"Column 1", "Column 2"});
JTable table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
column.setCellRenderer(new MultiCheckBoxRenderer());
column.setCellEditor(new MultiCheckBoxEditor());
column = table.getColumnModel().getColumn(1);
column.setCellRenderer(new MultiCheckBoxRenderer());
column.setCellEditor(new MultiCheckBoxEditor());
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}
这样,就可以在JTable的单元格中添加多个复选框了
原文地址: https://www.cveoy.top/t/topic/hLw1 著作权归作者所有。请勿转载和采集!