如何更改每个第二行的背景颜色?

时间:2014-03-10 13:32:02

标签: java swing jtable background-color tablecellrenderer

我尝试更改每个第二行的背景颜色。问题是只有第一个COLUMN受到影响。为什么呢?

    table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
    {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
            return c;
        }
    });

3 个答案:

答案 0 :(得分:5)

使用渲染器方法,您需要为表中的每种数据类型编写自定义渲染器。因此,如果您有String,Data,Integer,Boolean,则需要编写4个自定义渲染器。

有关允许您编写代码的方法,请参阅Table Row Rendering,无论表中包含多种数据类型。这种方法会覆盖JTable的preparerrenderer(...)方法。

答案 1 :(得分:2)

Concepts: Editors and Renderers教程的How to Use Tables部分所述,如果您没有为特定列指定渲染器,那么该表会调用表模型的getColumnClass方法来获取默认渲染器列类型。

如果您覆盖了getColumnClass方法,那么您的方法可能无法按预期工作。例如:

DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0) {
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        Class columnClass = Object.class;
        switch(columnIndex) {
            case 0: columnClass = String.class; break;
            case 1: columnClass = Boolean.class; break;
        }
        return columnClass;
    }
};

然后这样做:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {// your code here});

不适用于第二列,因为getColumnClass方法将返回Boolean.class并且该类的默认单元格渲染器(JCheckBox)。

在您的情况下,我建议您覆盖JTable.prepareRenderer()方法,而不是独立于渲染器类型(JLabelJCheckBox甚至自定义渲染器设置行背景颜色):

JTable table = new JTable(model) {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return c;
    }
};

答案 2 :(得分:1)

好的,废弃我刚写的所有内容。

尝试#2:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return this;
    }
});

您需要返回当前对象,而不是super()调用的引用。