JTable禁用单元格中的Checkbox

Yan*_*ael 5 java swing jtable renderer

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

tra*_*god 14

概念:编辑器和渲染器中所述,"单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格." 您需要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;
}
Run Code Online (Sandbox Code Playgroud)

附录:在上面的示例中,DateRenderer因为TableModel返回类型标记 而被唤起,因为Date.class它已成为默认类型.

table.setDefaultRenderer(Date.class, new DateRenderer());
Run Code Online (Sandbox Code Playgroud)

通过如下所示的重写可以获得相同的外观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;
    }
};
Run Code Online (Sandbox Code Playgroud)

  • @mKorbel:`prepareRenderer()`调用`getTableCellRendererComponent()`,结果是一样的.这种方法更为通用,特别是在数据模型非常重要的情况下. (2认同)