'Preencha' caracteres Unicode em rótulos

Como preencher caracteres Unicode em rótulos no Swing?

Eu estou tentando fazer uma interface de usuário para o programa de xadrez que eu programei recentemente (com peças de xadrez algo como visto acima). Nele estou usando caracteres unicode para representar minhas peças de xadrez (\u2654 através\u265F).

O problema é o seguinte:

Quando eu coloco o fundo da minha peça de xadrezJLabel para algo parecido com branco, todo o rótulo é preenchido (no meu caso, é um quadrado de 50 x 50 pixels de branco com o caractere no topo). Isso leva a minhas peças parecendo telhas em vez de apenas suas fotos.

Quando coloco o rótulo opaco, acabo de receber uma versão do meu tabuleiro de xadrez, não uma com o seu interior preenchido. POR EXEMPLO.

Existe uma maneira de preencher apenas o personagem?

Se não, eu acho que vou fazer uma folha de sprite, mas eu gosto disso porque eu posso usar as peças de xadreztoString() métodos para os rótulos.

Código
import java.awt.*;
import javax.swing.*;
import java.util.Random;

class ChessBoard {

    static Font font = new Font("Sans-Serif", Font.PLAIN, 50);
    static Random rnd = new Random();

    public static void addUnicodeCharToContainer(
        String s, Container c, boolean randomColor) {

        JLabel l = new JLabel(s);
        l.setFont(font);
        if (randomColor) {
            int r = rnd.nextInt(255);
            int g = rnd.nextInt(255);
            int b = rnd.nextInt(255);

            l.setForeground(new Color(r,g,b));
            l.setBackground(new Color(255-r,255-g,255-b));
            l.setOpaque(true);
        }
        c.add(l);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(0,6,4,4));

                String[] pieces = {
                    "\u2654","\u2655","\u2656","\u2657","\u2658","\u2659",
                    "\u265A","\u265B","\u265C","\u265D","\u265E","\u265F"
                };

                for (String piece : pieces) {
                    addUnicodeCharToContainer(piece,gui,false);
                }
                for (String piece : pieces) {
                    addUnicodeCharToContainer(piece,gui,true);
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

questionAnswers(3)

yourAnswerToTheQuestion