jtable如何对指定单元格进行属性设置

通过输入行和列指定单元格,设置该指定单元格是否可编辑,渲染组件,实现效果为整列中个别单元格不可编辑,其余可编辑,渲染不同组件

可以通过实现JTable的TableCellRenderer和TableCellEditor接口来对指定单元格进行属性设置,包括是否可编辑、渲染组件等。

以下是一个示例代码,演示如何对指定单元格进行属性设置:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

publicclassMyTableextendsJFrame {
    private JTable table;

    publicMyTable() {
        super("My Table");
        DefaultTableModelmodel=newDefaultTableModel(newObject[][]{
            {"1", "A", "100"},
            {"2", "B", "200"},
            {"3", "C", "300"}
        }, newString[]{"ID", "Name", "Value"});

        table = newJTable(model);

        // 设置第2行第3列不可编辑
        table.getColumnModel().getColumn(2).setCellEditor(newMyTableCellEditor());
        table.getColumnModel().getColumn(2).setCellRenderer(newMyTableCellRenderer());

        // 添加表格到窗口
        JScrollPanescrollPane=newJScrollPane(table);
        getContentPane().add(scrollPane);
    }

    privateclassMyTableCellEditorextendsAbstractCellEditorimplementsTableCellEditor {
        privateJTextFieldtextField=newJTextField();

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (row == 1 && column == 2) {
                textField.setEditable(false);
            } else {
                textField.setEditable(true);
            }

            textField.setText(value.toString());
            return textField;
        }

        public Object getCellEditorValue() {
            return textField.getText();
        }
    }

    privateclassMyTableCellRendererextendsDefaultTableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Componentcomp=super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            if (row == 1 && column == 2) {
                comp.setBackground(Color.LIGHT_GRAY);
            } else {
                comp.setBackground(Color.WHITE);
            }

            return comp;
        }
    }

    publicstaticvoidmain(String[] args) {
        MyTableframe=newMyTable();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

在示例代码中,我们定义了一个表格,然后使用MyTableCellEditor和MyTableCellRenderer类分别实现了TableCellEditor和TableCellRenderer接口来对指定单元格进行属性设置。在MyTableCellEditor类中,我们实现了getTableCellEditorComponent方法来返回渲染组件,并在其中根据行和列的值设置单元格的可编辑性。在MyTableCellRenderer类中,我们实现了getTableCellRendererComponent方法来返回渲染组件,并在其中根据行和列的值设置单元格的渲染组件。

在示例代码中,我们将第2行第3列的单元格设置为不可编辑,并使用不同的颜色进行渲染。您可以根据实际需求修改示例代码来满足您的需求。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以通过继承 JTable 并实现 TableCellRenderer 和 TableCellEditor 接口来自定义单元格渲染和编辑器。具体实现步骤如下:

1.创建一个继承自 JTable 的自定义表格类,重写 getCellRenderer(int row, int column) 和 getCellEditor(int row, int column) 方法,通过 row 和 column 参数获取对应单元格的渲染器和编辑器。

public class CustomTable extends JTable {

    public CustomTable(Object[][] data, String[] columnNames) {
        super(data, columnNames);
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        // 根据需要设置单元格渲染器
        if (row == 0 && column == 0) {
            return new CustomRenderer();
        } else {
            return super.getCellRenderer(row, column);
        }
    }

    @Override
    public TableCellEditor getCellEditor(int row, int column) {
        // 根据需要设置单元格编辑器
        if (row == 0 && column == 1) {
            return new CustomEditor();
        } else {
            return super.getCellEditor(row, column);
        }
    }
}


2.实现 TableCellRenderer 接口来自定义单元格的渲染,可以在该方法中返回不同的渲染组件来实现不同单元格的渲染效果。

public class CustomRenderer extends JLabel implements TableCellRenderer {

    public CustomRenderer() {
        setOpaque(true);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // 根据需要设置渲染效果
        if (row == 0 && column == 0) {
            setText("不可编辑");
            setForeground(Color.RED);
        } else {
            setText(value.toString());
            setForeground(Color.BLACK);
        }
        return this;
    }
}


3.实现 TableCellEditor 接口来自定义单元格的编辑器,可以在该方法中返回不同的编辑组件来实现不同单元格的编辑效果。

public class CustomEditor extends AbstractCellEditor implements TableCellEditor {

    private JCheckBox checkBox;

    public CustomEditor() {
        checkBox = new JCheckBox();
    }

    @Override
    public Object getCellEditorValue() {
        return checkBox.isSelected();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        // 根据需要设置编辑效果
        if (row == 0 && column == 1) {
            checkBox.setSelected(false);
            checkBox.setEnabled(false);
        } else {
            checkBox.setSelected((Boolean) value);
            checkBox.setEnabled(true);
        }
        return checkBox;
    }
}


4.在需要使用的地方使用自定义表格类,即可实现对指定单元格进行属性设置。

Object[][] data = {
    {"A1", true},
    {"A2", false},
    {"A3", true},
    {"A4", false}
};
String[] columnNames = {"列1", "列2"};
CustomTable table = new CustomTable(data, columnNames);


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632