如何更改 JTable 中单元格的背景和格式

How to change background and format of a cell in a JTable

在我的自定义 JTable 中,我有多个列。一列的类型为 java.sql.Timestamp。我想更改所有单元格的背景颜色,我只想更改时间戳单元格的格式。我制作了以下我调用的 customcellrenderer:

for(int i = 0; i < tableTask.getColumnCount(); i++)
{
    Class columnClass = myTaskTM.getColumnClass(i);
    TableCellRenderer defaultRenderer = tableTask.getDefaultRenderer(columnClass);
    tableTask.getColumnModel().getColumn(i).setCellRenderer(new CustomRenderer(defaultRenderer));
}

客户渲染器:

public class CustomRenderer extends DefaultTableCellRenderer
{
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    TableCellRenderer delegate;

    public CustomRenderer(TableCellRenderer defaultRenderer)
    {
        super();
        delegate = defaultRenderer;
    }

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

        Color foreground, background;

        if(!isSelected)
        {
            ...
        }
        else
        {
            background = javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground");
            //foreground = javax.swing.UIManager.getDefaults().getColor("Table.selectionForeground");
            foreground = Color.BLACK;
        }

        c.setForeground(foreground);
        c.setBackground(background);

        setValue(value);

        return c;
    }

    @Override
    public void setValue(Object value) {
        if (formatter == null) {
            formatter = DateFormat.getDateInstance();
        }
        if(value != null)
        {
            if(value.getClass().toString().equals("class java.sql.Timestamp"))
            {
                ((JLabel)delegate).setText((value == null) ? "" : formatter.format(value));
            }
            else
            {
                ((JLabel)delegate).setText(value.toString());
            }
        }
    }
}

setValue 仅在 getTableCellRendererComponent 被注释掉时有效。

我怎样才能让两者都起作用?

setValue()应该调用delegate.setText(),因为实际使用了委托的组件。此外,我什至看不到渲染器中调用 setValue() 的位置。

通过 Object value 在渲染器中调用它。