如“ 概念:编辑器和渲染器 ”中所述,“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。” 您需要维护表模型中的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;
}
};