Opa, então, fiz com JLayeredPane porque precisava colocar vários botões emcima e com um panel normal não deu muito certo, segue o código do Tabuleiro:
package TrilhaPackage;
import java.awt.*;
import javax.swing.*;
public class Tabuleiro extends JLayeredPane{
static Posicao posicoes[][];
public Tabuleiro() {
posicoes = new Posicao[7][7];
this.setBorder(new FundoSistema());
this.setBounds(10, 10, 380, 380);
//laço para criar todas as posições
for (int i = 0; i <= 6; i++) {
for (int j = 0; j <= 6; j++) {
if (i == 0 || i == 6) {
if (j == 0 || j == 3 || j == 6) {
posicoes[i][j] = new Posicao(i + "x" + j);
}
}
if (i == 1 || i == 5) {
if (j == 1 || j == 3 || j == 5) {
posicoes[i][j] = new Posicao(i + "x" + j);
}
}
if (i == 2 || i == 4) {
if (j >= 2 && j <= 4) {
posicoes[i][j] = new Posicao(i + "x" + j);
}
}
if (i == 3) {
if (j != 3) {
posicoes[i][j] = new Posicao(i + "x" + j);
}
}
}
}
//colocar as (botões)peças vazias no tabuleiro
//posição 0x0
this.getPosicao(0, 0).criaPeca(0);
posicoes[0][0].getPeca().setBounds(3, 3, 30, 30);
this.add(posicoes[0][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 0x3
this.getPosicao(0, 3).criaPeca(0);
posicoes[0][3].getPeca().setBounds(175, 3, 30, 30);
this.add(posicoes[0][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 0x6
this.getPosicao(0, 6).criaPeca(0);
posicoes[0][6].getPeca().setBounds(347, 3, 30, 30);
this.add(posicoes[0][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 1x1
this.getPosicao(1, 1).criaPeca(0);
posicoes[1][1].getPeca().setBounds(60, 60, 30, 30);
this.add(posicoes[1][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 1x3
this.getPosicao(1, 3).criaPeca(0);
posicoes[1][3].getPeca().setBounds(175, 60, 30, 30);
this.add(posicoes[1][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 1x5
this.getPosicao(1, 5).criaPeca(0);
posicoes[1][5].getPeca().setBounds(290, 60, 30, 30);
this.add(posicoes[1][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 2x2
this.getPosicao(2, 2).criaPeca(0);
posicoes[2][2].getPeca().setBounds(118, 117, 30, 30);
this.add(posicoes[2][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 2x3
this.getPosicao(2, 3).criaPeca(0);
posicoes[2][3].getPeca().setBounds(175, 117, 30, 30);
this.add(posicoes[2][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 2x4
this.getPosicao(2, 4).criaPeca(0);
posicoes[2][4].getPeca().setBounds(232, 117, 30, 30);
this.add(posicoes[2][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x0
this.getPosicao(3, 0).criaPeca(0);
posicoes[3][0].getPeca().setBounds(60, 175, 30, 30);
this.add(posicoes[3][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x1
this.getPosicao(3, 1).criaPeca(0);
posicoes[3][1].getPeca().setBounds(3, 175, 30, 30);
this.add(posicoes[3][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x2
this.getPosicao(3, 2).criaPeca(0);
posicoes[3][2].getPeca().setBounds(118, 175, 30, 30);
this.add(posicoes[3][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x4
this.getPosicao(3, 4).criaPeca(0);
posicoes[3][4].getPeca().setBounds(232, 175, 30, 30);
this.add(posicoes[3][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x5
this.getPosicao(3, 5).criaPeca(0);
posicoes[3][5].getPeca().setBounds(290, 175, 30, 30);
this.add(posicoes[3][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 3x6
this.getPosicao(3, 6).criaPeca(0);
posicoes[3][6].getPeca().setBounds(347, 175, 30, 30);
this.add(posicoes[3][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 4x2
this.getPosicao(4, 2).criaPeca(0);
posicoes[4][2].getPeca().setBounds(118, 233, 30, 30);
this.add(posicoes[4][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 4x3
this.getPosicao(4, 3).criaPeca(0);
posicoes[4][3].getPeca().setBounds(175, 233, 30, 30);
this.add(posicoes[4][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 4x4
this.getPosicao(4, 4).criaPeca(0);
posicoes[4][4].getPeca().setBounds(232, 233, 30, 30);
this.add(posicoes[4][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 5x1
this.getPosicao(5, 1).criaPeca(0);
posicoes[5][1].getPeca().setBounds(60, 290, 30, 30);
this.add(posicoes[5][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 5x3
this.getPosicao(5, 3).criaPeca(0);
posicoes[5][3].getPeca().setBounds(175, 290, 30, 30);
this.add(posicoes[5][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 5x5
this.getPosicao(5, 5).criaPeca(0);
posicoes[5][5].getPeca().setBounds(290, 290, 30, 30);
this.add(posicoes[5][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 6x0
this.getPosicao(6, 0).criaPeca(0);
posicoes[6][0].getPeca().setBounds(3, 348, 30, 30);
this.add(posicoes[6][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 6x3
this.getPosicao(6, 3).criaPeca(0);
posicoes[6][3].getPeca().setBounds(175, 348, 30, 30);
this.add(posicoes[6][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
//posição 6x6
this.getPosicao(6, 6).criaPeca(0);
posicoes[6][6].getPeca().setBounds(347, 348, 30, 30);
this.add(posicoes[6][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);
}
protected Posicao getPosicao(int lin, int col) {
return posicoes[lin][col];
}
}