Cambio de colores de celda Swing JTable

Estoy tratando de sentirme cómodo con JTables, TableModels, JTableHeaders, renderizadores, etc. Estoy tratando de hacer una tabla ficticia simple (para fines de práctica) que se vea así:

-    1    2   3
A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

También quiero que la celda B2, y solo esa celda, tenga un fondo azul (Color.BLUE); todas las demás celdas pueden tener el color predeterminado de Swing que se asignan automáticamente.

Mi código está abajo y se basa en innumerables ejemplos que he encontrado en este sitio web y en Internet en general. Pero no estoy obteniendo los resultados que quiero. En cambio, obtengo una tabla que se ve así:

A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

Observe que la primera fila (el encabezado) no está allí en absoluto. Además, con el código que enumero a continuación, se ejecuta y establece el color detodo las celdas de ese color, no solo la celda B2 que quiero.

El códig:

public class MyTable
{
    public static void main(String[] args)
    {
        String[][] data = getTableData();
        String[] cols = getTableCols();

        JFrame frame = magicallyCreateJFrame();     // I promise this works!
        MyRenderer myRenderer = new MyRenderer();   // See below

        DefaultTableModel defModel = new DefaultTableModel(data, cols);
        JTable myTable = new JTable(defModel);

        myTable.setDefaultRenderer(Object.class, myRenderer);

        frame.add(myTable);
        frame.pack();
        frame.setVisible(true);            
    }
}

public static String[] getTableCols()
{
    String cols =
    {
        "-",
        "1",
        "2",
        "3",
    };
}

public static String[][] getTableData()
{
    String[][] data =
    {
        {
            "A",
            "A1",
            "A2",
            "A3",
        },
        {
            "B",
            "B1",
            "B2",
            "B3",
        },
        {
            "C",
            "C1",
            "C2",
            "C3",
        },
    };

    return data;
}

Y el rápido y sucioMyRenderer clase

public class MyRenderer 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); 

    if(row == 2 && column == 2)
        c.setBackground(new java.awt.Color(0, 0, 255)); 

    return c; 
} 

} 

Además del hecho de que esto eshorribl codifica y rompe muchos patrones y técnicas de tipo "mejores prácticas" (recuerde que esto es algo con lo que estoy jugando), hay algo que estoy haciendo aquí que es evidentemente obvio? ¿Por qué no obtengo un encabezado de tabla (primera fila "- 1 2 3")? ¿Por qué mi renderizador de celda predeterminado no funciona en la celda B2 específica que estoy especificando?

JTables parecen ser bestias extrañas, hermosas y poderosas. Lentamente estoy envolviendo mi mente alrededor de ellos, pero me estoy ahogando con la implementación. ¡Gracias a todos los que pueden ayudar!

Respuestas a la pregunta(5)

Su respuesta a la pregunta