JTable设置禁用复选框以查找不可编辑单元格。

3
我有一个带有布尔值列的JTable。根据模型中存储的状态,我会使其中一些或所有单元格不可编辑(模型的isCellEditable()返回false)。然而,这并不会使JTable布尔渲染器在不可编辑的单元格中呈现复选框为禁用状态。
除了编写自定义布尔渲染器外,还有其他方法可以实现此功能吗?
如果我需要编写自己的渲染器,除了JCheckbox之外,我应该扩展哪个类?我只需要在渲染之前禁用复选框,不想实现所有渲染代码并处理所选外观等内容。

2
为了更快地获得帮助,请发布一个MCVE(最小完整可验证示例)。 - Andrew Thompson
同意使用SSCCE/MCVE,即短小、可运行、可编译的代码片段,并在本地变量中硬编码JTable/XxxTableModel的值。 - mKorbel
2个回答

4

然而,这并不意味着JTable布尔渲染器会将复选框呈现为不可编辑单元格的禁用状态。

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

除了编写自定义布尔渲染器外,还有其他方法可以实现此目的吗?

据我所知,没有。

如果我需要编写自己的渲染器,除了 JCheckbox 外,我应该扩展哪个类?

实现 TableCellRenderer 接口时不必扩展任何类。您可以完全将 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;
    }
}

你可以参考这篇相关问题的问答:JXTable:如何仅为特定单元格使用TableCellEditor和TableCellRenderer,而不是整个列


0

没有一个可用的示例,很难确定出错的具体原因,但听起来你可能忘记了触发表格修改事件来通知 JTable 它需要重新绘制自己。当你进行更改时,你的模型需要类似这样的代码:

fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol));

您可以触发不同的表格更改事件,并传递不同的参数给TableModelEvent构造函数。您可以在此处的Javadocs中找到更多信息:http://docs.oracle.com/javase/8/docs/api和Java教程中的这里:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire。您需要阅读这些内容,以确定哪些是适合您特定情况的。

我认为不需要自定义布尔渲染器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接