在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的单元格中添加多个复选框了

java swing如何在JTable一个单元格添加多个复选框

原文地址: https://www.cveoy.top/t/topic/hLw1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录