在改变JTable的单元颜色时进行不同的更改

时间:2016-05-28 15:11:00

标签: java swing

在我的Java程序中,我遇到了配置表格单元格颜色的问题。 如下所示,我在单元格中有4个不同的列组件。 当我改变所有这些单元格的颜色时,只需改变column1的颜色。

DefaultTableModel tableModel = new DefaultTableModel(columns,0){
    @Override
    public Class<?> getColumnClass(int column) {
        switch(column) {
            case 0: return String.class;
            case 1: return ImageIcon.class;
            case 2: return Integer.class;
            case 3: return Integer.class;
            default: return Object.class;
        }
    }
};

我改变了那样的细胞颜色:

table1.setDefaultRenderer(Object.class, new ColorChange);
// I guess Object.class causes the problem
public class ColorChange implements TableCellRenderer {

    public final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table,
                value, isSelected, hasFocus, row, column);

        // Apply zebra style on table rows
        if (row % 2 == 0) {
            c.setBackground(Color.WHITE);
        } else {
            c.setBackground(Color.decode("#F8F8F8"));
        }

        return c;
    }

}

所以问题是如何更改所有列的颜色?

提前谢谢。

1 个答案:

答案 0 :(得分:3)

  

如下所示,我在单元格中有4个不同的列组件。当我改变所有这些单元格的颜色时,只需改变column1的颜色。

table1.setDefaultRenderer(Object.class, new ColorChange);

渲染器仅用于指定的类。对于没有特定渲染器的类,Object.class被指定为catch all类。

在您的情况下,它仅用于String个对象。 IconInteger类已有自定义渲染器。

您还可以添加:

table1.setDefaultRenderer(Icon.class, new ColorChange);
table1.setDefaultRenderer(Integer.class, new ColorChange);

但是,如果这样做,您将失去这些渲染器的自定义格式。如果你想继续这种方法,你需要一个“IconColorChange”和“IntegerColorChange”渲染器。

相反,我建议你查看Table Row Rendering一个解决方案,它允许你在使用渲染器或表的自定义格式的同时进行行级着色。这不需要创建自定义渲染器。