Veja como eu costumo fazer:
Primeiro crio uma classe ImagePanel que nada mais é do que um JPanel que renderiza uma imagem ao fundo:
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class ImagePanel extends JPanel {
	/**
	 * Cria um ImagePanel que renderiza a imagem de forma centralizada
	 */
	public static ImagePanel centered(InputStream input) throws IOException {
		return new ImagePanel(input, new Painter() {
			@Override
			public void paint(Container container, Image image, Graphics graphics) {
				int containerWidth = container.getWidth();
				int containerHeight = container.getHeight();
				int imageWidth = image.getWidth(container);
				int imageHeight = image.getHeight(container);
				int x = (containerWidth - imageWidth) / 2;
				int y = (containerHeight - imageHeight) / 2;
				graphics.drawImage(image, x, y, imageWidth, imageHeight, container);
			}
		});
	}
	/**
	 * Cria um ImagePanel que renderiza a imagem de forma esticada
	 */
	public static ImagePanel stretched(InputStream input) throws IOException {
		return new ImagePanel(input, new Painter() {
			@Override
			public void paint(Container container, Image image, Graphics graphics) {
				int containerWidth = container.getWidth();
				int containerHeight = container.getHeight();
				int x = 0;
				int y = 0;
				graphics.drawImage(image, x, y, containerWidth, containerHeight, container);
			}
		});
	}
	private static interface Painter {
		public void paint(Container container, Image image, Graphics graphics);
	}
	private static final long serialVersionUID = 1;
	private final BufferedImage image;
	private final Painter painter;
	private ImagePanel(InputStream input, Painter painter) throws IOException {
		if (input == null) {
			throw new IllegalArgumentException("input cannot be null");
		}
		if (painter == null) {
			throw new IllegalArgumentException("painter cannot be null");
		}
		this.image = ImageIO.read(input);
		this.painter = painter;
	}
	@Override
	protected void paintComponent(Graphics graphics) {
		super.paintComponent(graphics);
		painter.paint(this, image, graphics);
	}
}
Depois utilizo esse ImagePanel quando eu preciso de um Container que desenhe uma imagem de fundo, veja o exemplo abaixo:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Exemplo {
	public static void main(String[] args) {
		try {
			Exemplo programa = new Exemplo();
			programa.executar();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
	private void executar() throws IOException {
		InputStream imagem1 = getClass().getResourceAsStream("/imagem.jpg");
		ImagePanel imagePanel1 = ImagePanel.centered(imagem1);
		JFrame janela1 = criaJanela(imagePanel1, "Centralizada");
		InputStream imagem2 = getClass().getResourceAsStream("/imagem.jpg");
		ImagePanel imagePanel2 = ImagePanel.stretched(imagem2);
		JFrame janela2 = criaJanela(imagePanel2, "Esticada");
		Rectangle r = janela1.getBounds();
		janela1.setLocation(r.x - r.width / 2, r.y);
		janela2.setLocation(r.x + r.width / 2, r.y);
		janela1.setVisible(true);
		janela2.setVisible(true);
	}
	private JFrame criaJanela(ImagePanel imagePanel, String titulo) {
		JPanel painelSuperior = new JPanel();
		painelSuperior.setOpaque(false);
		painelSuperior.add(new JLabel("Label"));
		painelSuperior.add(new JTextField("TextField"));
		JScrollPane painelInferior = new JScrollPane(new JTextArea("TextArea"));
		painelInferior.setPreferredSize(new Dimension(100, 150));
		painelInferior.setOpaque(false);
		imagePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		imagePanel.setLayout(new BorderLayout());
		imagePanel.add(painelSuperior, BorderLayout.NORTH);
		imagePanel.add(painelInferior, BorderLayout.SOUTH);
		JFrame frame = new JFrame(titulo);
		frame.setContentPane(imagePanel);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
		frame.setLocationRelativeTo(null);
		return frame;
	}
}