ArrayList e JPanel

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class GridPanel extends JPanel
{
	private static ArrayList<JPanel> cellList;
	public static JPanel cell;
	
	public GridPanel(int cols, int rows)
	{
		setLayout(new GridLayout(rows, cols));
		setBorder(BorderFactory.createEtchedBorder());
		
		cellList = new ArrayList<JPanel>();
		
		for(int i=0; i<cols; i++)
			for(int j=0; j<rows; j++)
			{
				cell = new JPanel();
				cell.setBorder(BorderFactory.createEtchedBorder());
				cellList.add(cell);
				add(cell);
			}
	}
}

Se os painéis estão dentro da Lista, basta buscá-los pelo número de índice deles e mudar a característica que vc quiser:

public void setCorFundoPanel(int nrPanel, Color cor){
    if(nrPanel<cellList.size()){
            cell = cellList.get(nrPanel);
            cell.setBackground(cor);            
        }
    }

O problema é que vc criou uma matriz de painéis que roda linha e coluna e apenas cria painéis e joga dentro do
ArrayList, numericamente, com uma única dimensão. então para vc saber qual o número dele no array, terá de criar
uma fórmula que calcule a posição do painél usando linha e coluna e transformando em um valor único.

Imagine que você tenha uma matriz de 6 linhas por 8 colunas e quer acessar o painel que vai aparecer na linha 3 coluna 5.

Qual o número dele no array?

A fórmula seria:

(linhaPainel - 1) * totalColunas + (colunaPainel - 1)

(3 - 1) * 8 + (5 - 1) = 20

Essa forma te dá o painel 20 do ArrayList que é o painel equivalente a linha 3, coluna 5 da matriz.

Com isso você acessa qualquer um deles dentro do Array e muda qualquer coisa com métodos semelhantes a esse que criei acima.

setCorFundoPainel(20, new Color(RGB(255,0,0)));

De resto você vai ter de carregar esse GridPanel num Frame e redesenhar ele sempre que algo for mudado.

Boa sorte.

Outra forma interessante se você é um cara que quer aprender mais,
é criar um ArrayList bidimensional, isto é, um ArrayList de arraylists e
dentro destes os painéis.

private static ArrayList rowList;

daí na hora de começar a primeira linha,

você faz um

private static ArrayList cellList;

Acrescenta no cellList os panels como você criou

e quando termina a lista

rowList.add(cellList).

Fecha a lista cellList, cria um novo

e parte para a proxima linha.

Assim, quando quisesse uma posicao, faria

JPanel painel = rowList.get(row).get(col);

e continuaria mantendo teu esquema de matriz sem precisar
fazer muito cálculo.

De fato, a única coisa que você precisa é um método que converte coordenadas bi-dimensionais em coordenada de uma dimensão apenas. Você pode dispensar o ArrayList e usar o armazenamento interno do próprio container para obter os painéis.