Java JTable set disabled复选框查找不可编辑的单元格

Java JTable set disabled复选框查找不可编辑的单元格,java,swing,jtable,boolean,jcheckbox,Java,Swing,Jtable,Boolean,Jcheckbox,我有一个带有布尔值列的JTable。根据存储在模型中的状态,我将部分或全部设置为不可编辑(模型的isCellEditable()返回false)。但是,这不会使JTable布尔呈现器将复选框呈现为禁用不可编辑单元格 除了编写自定义布尔渲染器,还有其他方法可以实现这一点吗 如果我需要编写自己的渲染器,除了JCheckbox,我应该扩展什么类?我只需要在渲染之前禁用复选框,不想实现所有渲染代码并处理选定的外观和内容。如果没有一个工作示例,很难说到底是什么问题,但听起来您可能忘记触发表修改事件来通知J

我有一个带有布尔值列的
JTable
。根据存储在模型中的状态,我将部分或全部设置为不可编辑(模型的
isCellEditable()
返回false)。但是,这不会使
JTable
布尔呈现器将复选框呈现为禁用不可编辑单元格

除了编写自定义布尔渲染器,还有其他方法可以实现这一点吗


如果我需要编写自己的渲染器,除了
JCheckbox
,我应该扩展什么类?我只需要在渲染之前禁用复选框,不想实现所有渲染代码并处理选定的外观和内容。

如果没有一个工作示例,很难说到底是什么问题,但听起来您可能忘记触发表修改事件来通知JTable它需要重新绘制自己。当您进行更改时,您的模型中需要类似的内容:

fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol));
您可以触发不同的表更改事件,也可以向TableModelEvent构造函数传递不同的参数。您可以在这里的Javadocs和这里的Java教程中找到更多信息。你需要阅读这些内容,以确定哪些内容适合你的具体情况

我怀疑是否需要自定义布尔渲染器

但是,这不会使JTable boolean渲染器将复选框渲染为不可编辑单元格的禁用状态

这是正确的,因为这是默认渲染器的行为:
JCheckBox
不可编辑但未禁用

除了编写自定义布尔渲染器,还有其他方法可以实现这一点吗

不,据我所知

如果我需要编写自己的渲染器,除了JCheckbox之外,我应该扩展什么类

扩展任何类来实现接口不是强制性的。您完全可以使用
JCheckBox
作为渲染器的类成员。实际上,组合比继承更受欢迎

我只需要在渲染之前禁用复选框,不想实现所有渲染代码并处理选定的外观和内容

这并不难,你可以控制正在发生的事情。考虑下面的例子:

class CheckBoxCellRenderer implements TableCellRenderer {

    private final JCheckBox renderer;

    public CheckBoxCellRenderer() {
        renderer = new JCheckBox();
        renderer.setHorizontalAlignment(SwingConstants.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Color bg = isSelected ? table.getSelectionBackground() : table.getBackground();
        renderer.setBackground(bg);
        renderer.setEnabled(table.isCellEditable(row, column));
        renderer.setSelected(value != null && (Boolean)value);
        return renderer;
    }
}

有关相关问题,请参阅此问答:

要更快获得更好的帮助,请发布一个(最小完整可验证示例)。同意SSCCE/MCVE,简短、可运行、可编译,并在局部变量中使用JTable/XxxTableModel的硬编码值