我有一个JTable,我想用自定义渲染器尝试检查isEnabled()的所有禁用的复选框单元变灰,然后更改背景颜色,但仍然无法使用。有什么建议么?谢谢!!!
如“ 概念:编辑器和渲染器 ”中所述,“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。” 您需要维护表模型中的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; }
};