用Java更改表格单元格颜色

时间:2010-05-06 11:09:37

标签: java swing jtable

我已阅读并实施了此Changing JTable cell color

我想知道的是如何实际使用此代码?我只想在点击它时更改表格单元格的颜色。

3 个答案:

答案 0 :(得分:8)

在您引用的代码中,您有一个自定义的CellRenderer。

将表格添加到表格后,您只需在适当的位置进行格式化:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting here

        return c;
    }
}

DefaultTableCellRenderer只是在JTable中用于绘制单元格的组件。更准确地说,在这种情况下,组件是JLabel(您可以通过检查DefaultTableCellRenderer中的源来看到这一点。)

所以你应该做的所有格式都在“c”对象上(或“this”,因为该方法实际上每次都返回相同的组件:本身)。例如,c.setBackground()将允许您设置背景颜色。

将为JTable的每个单元调用被覆盖的getTableCellRendererComponent()方法,并使用参数告知您上下文。你知道表,行,列,应该显示的值,你也知道是否选择了单元格,这可能对你的情况有所帮助:

if (selected)
    c.setBackground(Color.YELLOW);

更进一步,请注意,因为您重写了DefaultTableCellRenderer类并使用了自己的方法,所以您已经完成了一些格式化操作,例如背景颜色,这是表中的颜色。因此,您只需在需要时定义自己的颜色。如果没有,你将不得不关注所有情况,因为由于使用相同的组件,你将以颜色集结束一次,然后应用于所有连续的单元格,因为没有做任何改变它。

我建议您阅读DefaultTableCellRenderer中的源代码(以及它在JTable中的用法),如果您想了解更多有关它的完成和使用方式的信息。

答案 1 :(得分:2)

这是否意味着细胞颜色永远变化,或者一旦您点击另一个细胞就重置它。

如果您只想暂时更改颜色,那么最简单的方法是使用Table Row Rendering中提供的概念,这样您就不必为每种类型的数据创建多个渲染器。

如果您希望单元格颜色是永久性的,那么它将更加复杂,因为现在您实际上需要为每个应该以不同颜色着色的单元格保存数据。同样最简单的方法是使用上面的方法,然后保留一组所有彩色单元格。

答案 2 :(得分:0)

当我想在JTable中为特定单元格着色时,我也很挣扎。 您可以创建自定义表格单元格渲染并将行/列作为参数发送:

class CustomRenderer extends DefaultTableCellRenderer {
    int col; 
    int row;
    public CustomRenderer (int col, int row) 
    {
       this.col = col;
       this.row = row;
    }
    public Component getTableCellRendererComponent
(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent
                          (table, value, isSelected, hasFocus, row, column);

        setForeground( (column == this.col && row == this.row) 
                                   ? Color.red : Color.black );

        return c;
    }
}

table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer(0, 1);
table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer(1, 3);