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

时间:2014-10-22 07:53:31

标签: java swing jtable boolean jcheckbox

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

除了编写自定义布尔渲染器之外,还有办法解决这个问题吗?

如果我需要编写自己的渲染器,我应该扩展哪个类而不是JCheckbox?我只是需要在渲染之前禁用复选框,并且不希望实现所有渲染代码并处理选定的外观和内容。

2 个答案:

答案 0 :(得分: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: use a TableCellEditor and TableCellRenderer for a specific cell instead of the whole column

答案 1 :(得分: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。您需要阅读这些内容,以确定哪些适合您的特定情况。

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