Colorear celdas de JTable basadas en una matriz creada por el juego Tetris

Estoy intentando crear una GUI de Tetris. Mi amigo escribió el backend. Hasta ahora, acabábamos de tener la placa de tetris (o cuadrícula como la menciono en mi código) impresa en la ventana de la consola. En el código a continuación, estoy configurando una JTable para que actúe como el tablero para el juego de Tetris. Me preguntaba cómo podría hacer que mi JTable renderice cada elemento de la cuadrícula en función de la cuadrícula pasada del 'juego' de Tetris declarado en la parte superior de la clase de Windows. Esta cuadrícula es una matriz 2D de valor entero que se refiere a los colores enumerados en la clase de Piezas. ¿Alguna sugerencia? A partir de ahora solo imprime un color.

También publiqué un código para la clase Tetris solo para que pueda ver los métodos y parámetros disponibles allí.

Aquí está mi código (con suerte en SSCCE = p):

public class Window {
    JPanel cards;
    final static String SPLASHSCREEN = "SplashScreen";
    final static String MAINMENU = "MainMenu";
    final static String TETRIS = "Tetris";
    final static int GRID_ROW_HEIGHT = 30;
    final static int NUM_ROWS = 20;
    final static int NUM_COLS = 10;
    JTable table = new JTable(new MyTableModel());
    Tetris game = new Tetris(); 

    public void addComponentToWindow(Container pane) {
        // Create the "cards"
        .
        .
        .

        // SplashScreen setup
        .
        .
        .

        // MainMenu setup
        .
        .
        .

        // Tetris setup
        final JButton startGame = new JButton("START GAME");
        card3.setLayout(new GridBagLayout());
        GridBagConstraints gbc2 = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(2, 2, 2, 2);
        card3.add(startGame, gbc2);
        gbc.gridy = 1;
        startGame.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {                
                table.setDefaultRenderer(Object.class, new MyRenderer());
                table.setRowHeight(GRID_ROW_HEIGHT);
                table.setFocusable(false);
                table.setRowSelectionAllowed(false);
                for (int i = 0; i < game.getNumCols(); i++) {
                    table.getColumnModel().getColumn(i).setPreferredWidth(table.getRowHeight());
                }

                card3.add(table);
                card3.remove(0); //Removes button
                card3.revalidate(); //Redraws graphics
            }
        });

        // Sets up layout
        cards = new JPanel(new CardLayout());
        cards.add(card1, SPLASHSCREEN);
        cards.add(card2, MAINMENU);
        cards.add(card3, TETRIS);

        // Creates the actual window
        pane.add(cards, BorderLayout.CENTER);
    }

    public Color getTableCellBackground(JTable table, int row, int col) {
        TableCellRenderer renderer = table.getCellRenderer(row, col);
        Component component = table.prepareRenderer(renderer, row, col);    
        return component.getBackground();
    }

    class MyRenderer implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JTextField editor = new JTextField();
            if (value != null) {
                editor.setText(value.toString());
            }
            if (game.getCur_color().getKey() == 0) {
                editor.setBackground(Color.WHITE);
            }
            else if (game.getCur_color().getKey() == 1) {
                editor.setBackground(Color.RED);
            }
            else if (game.getCur_color().getKey() == 2) {
                editor.setBackground(Color.GREEN);
            }
            else if (game.getCur_color().getKey() == 3) {
                editor.setBackground(Color.BLUE);
            }
            else if (game.getCur_color().getKey() == 4) {
                editor.setBackground(Color.YELLOW);
            }
            return editor;
        }
    }

    @SuppressWarnings("serial")
    class MyTableModel extends AbstractTableModel {
        public int getColumnCount() {
            return NUM_COLS;
        }
        public int getRowCount() {
            return NUM_ROWS;
        }        
        public Object getValueAt(int row, int col) {
            return null;
        }
    }
}

Clase de Tetris:

public class Tetris 
{
    int NUM_ROWS = 20;
    int NUM_COLS = 10;

    int grid[][];
    int cur_row;
    int cur_col;
    Pieces cur_color;
    Style cur_style;
    Pieces next_color;
    Style next_style;
    boolean over;

    public Tetris()
    {
        grid = new int[10][20];

        for(int i = 0; i < 10; i ++)
        {
            for(int j = 0; j < 20; j ++)
            {
                grid[i][j] = Pieces.BLANK.getKey();
            }
        }

        next_color = Pieces.createColor();
        next_style = Style.createStyle();
        over = false;

        create_Piece();
    }

    public void createPiece(){...}
    public void setPiece(){...}
    public void removeRow(){...}
}

Junto con moveLeft, moveRight, moveDown, rotateLeft, rotateRight, printGame y getters y setters para todos los campos. Todos los métodos en la clase Tetris fueron probados en la consola y funcionan correctamente. Aquí está una salida de lo que tengo hasta ahora. Cada vez que el color es diferente y estoy bastante seguro de que sé por qué, pero tengo problemas para pensar en cómo colorear cada celda según la matriz de cuadrícula creada en la clase Tetris.

Respuestas a la pregunta(1)

Su respuesta a la pregunta