Você tem que usar um TexturePaint.
- Primeiramente, você cria um retângulo, com as dimensões que a imagem terá.
- Você cria um TexturePaint, usando a imagem e a âncora;
- Associe o seu contâiner ao seu objeto graphics.
- Depois você pinta o fundo do seu container.
Exemplo (esse exemplo considera que você possui o atributo img, um BufferedImage já carregado com a imagem que você quer):
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g.create();
Rectangle2D anchor = Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight());
TexturePaint paint = new TexturePaint(img, anchor);
g2d.setPaint(paint);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
}
PS: Não testei o código, não tenho certeza que funcione. Talvez tenha um outro outro bug, mas o princípio é esse aí.