一尘不染

JTable禁用单元格中的复选框

java

我有一个JTable,我想用自定义渲染器尝试检查isEnabled()的所有禁用的复选框单元变灰,然后更改背景颜色,但仍然无法使用。有什么建议么?谢谢!!!


阅读 320

收藏
2020-03-18

共1个答案

一尘不染

如“ 概念:编辑器和渲染器 ”中所述,“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。” 您需要维护表模型中的enabled状态。

附录:作为一个具体示例,此示例中的数据模型是一组简单的Date实例。getTableCellRendererComponent()如下所示覆盖将导致禁用奇数天。在这种情况下,奇数是Date值本身固有的属性,但是可以针对所有相关属性查询模型。

禁用图片

@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) value);
Component c = super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, col);
c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0);
return c;
}
附录:在上面的示例中,DateRenderer之所以会调用,是因为TableModel返回值类型令牌 Date.class已被设置为默认值。

table.setDefaultRenderer(Date.class, new DateRenderer());
可以通过覆盖如下所示的方法获得相同的外观prepareRenderer(),但是该方法将为所有单元调用,而与类无关。因此,prepareRenderer()非常适合影响整个行,如表行渲染中所示。

private final JTable table = new JTable(model) {

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
    Component c = super.prepareRenderer(renderer, row, col);
    if (col == DATE_COL) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime((Date) model.getValueAt(row, col));
        c.setEnabled(calendar.get(Calendar.DAY_OF_MONTH) % 2 == 0);
    }
    return c;
}

};

2020-03-18