JTable禁用单元格中的Checkbox

时间:2011-04-27 03:23:08

标签: java swing jtable renderer

您好我有一个JTable并且我希望灰色显示我尝试使用自定义渲染器检查isEnabled()然后更改背景颜色但仍然无法工作的所有禁用复选框单元格。 有什么建议? 感谢!!!

1 个答案:

答案 0 :(得分:14)

Concepts: Editors and Renderers所述,“单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。”您需要在table model中保持enabled州。

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

disabled image

@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会返回type token Date.class,因为它已成为默认值。

table.setDefaultRenderer(Date.class, new DateRenderer());

可以通过覆盖prepareRenderer()获得相同的外观,如下所示,但不管是哪个类,都会为所有单元调用该方法。因此,prepareRenderer()非常适合影响整行,如Table Row Rendering

所示
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;
    }
};