在Java中更改表格单元格颜色

在Java中更改表格单元格颜色,java,swing,jtable,Java,Swing,Jtable,我已经阅读并实现了这一点 我想知道的是如何实际使用这个代码?我只想在单击表格单元格时更改其颜色。在您参考的代码中,您有一个自定义的单元格渲染器 将其添加到表中后,只需在适当的位置进行格式化: class CustomRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected

我已经阅读并实现了这一点


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

在您参考的代码中,您有一个自定义的单元格渲染器

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

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的每个单元格调用被重写的
getTableCellRenderComponent()
方法,其中的参数告诉您有关上下文的信息。您知道表格、行、列、应该显示的值,还知道是否选择了单元格,这有助于您的案例:

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

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


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

这是否意味着单元格颜色将永远改变,还是单击另一个单元格后将其重置

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


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

当我想给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);