Prima per un attimo mi sono sbagliato: paintComponent() non centra con JFrame ma solo con JComponent e derivati. Comunque basta estendere JPanel e usare quello come sfondo del JFrame (e i componenti andranno messi dentro il panel).

Una cosa del tipo (molto abbozzata, eh!):

codice:
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.imageio.*;

public class TestFrame extends JFrame
{
    public TestFrame ()
    {
        super ("Prova");

        Image backImg = null;

        try {
            backImg = ImageIO.read (new URL ("http://www.google.com/intl/en_ALL/images/logo.gif"));
        } catch (IOException e) { }

        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setSize (300, 300);
        
        BackPanel panel = new BackPanel (backImg);
        add (panel);
        
        panel.add (new JLabel ("Esempio"));
    }

    public static void main (String[] args)
    {
        SwingUtilities.invokeLater (new Runnable ()
        {
            public void run ()
            {
                TestFrame f = new TestFrame ();
                f.setVisible (true);
            }
        });
    }
}


class BackPanel extends JPanel
{
    private Image backImg;

    public BackPanel (Image backImg)
    {
        this.backImg = backImg;
    }

    public void paintComponent (Graphics g)
    {
        super.paintComponent (g);
        g.drawImage (backImg, 0, 0, this);
    }
}