Fera, seus problemas acabaram! Use DrawImage para pintar a imagem num JPanel de fundo do seu formulário...
Eu precisei de algo parecido ao que está querendo e resolvi assim:
1 - Crie uma classe chamada JImagePanel e cole nela o seguinte código:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class JImagePanel extends JPanel {
private BufferedImage image = null;
private FillType fillType = FillType.ASPECT_RATIO_CENTER;
public JImagePanel(BufferedImage img) {
setImage(img);
}
public JImagePanel(File imgSrc) throws IOException {
this(ImageIO.read(imgSrc));
}
public JImagePanel(String fileName) throws IOException {
this(new File(fileName));
}
public final void setImage(BufferedImage img) {
if (img == null)
throw new NullPointerException("Sem imagem para processar!");
this.image = img;
invalidate();
}
public void setImage(File img) throws IOException {
setImage(ImageIO.read(img));
}
public void setImage(String fileName) throws IOException {
setImage(new File(fileName));
}
public BufferedImage getImage() {
return image;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
fillType.drawImage(this, g2d, image);
g2d.dispose();
}
public FillType getFillType() {
return fillType;
}
public void setFillType(FillType fillType) {
if (fillType == null)
throw new IllegalArgumentException("Invalid fill type!");
this.fillType = fillType;
invalidate();
}
public static enum FillType {
RESIZE {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
g2d.drawImage(image, 0, 0, panel.getWidth(), panel.getHeight(),
null);
}
},
CENTER {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
int left = (panel.getHeight() - image.getHeight()) / 2;
int top = (panel.getWidth() - image.getWidth()) / 2;
g2d.drawImage(image, top, left, null);
}
},
SIDE_BY_SIDE {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
Paint p = new TexturePaint(image, new Rectangle2D.Float(0, 0, image.getWidth(), image.getHeight()));
g2d.setPaint(p);
g2d.fillRect(0, 0, panel.getWidth(), panel.getHeight());
}
},
ASPECT_RATIO {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
int larguraImg = image.getWidth(), alturaImg = image.getHeight();
int largura = 0, altura = 0;
double aspectoImg = (double) larguraImg / (double) alturaImg;
double aspectoPanel = (double) panel.getWidth() / (double) panel.getHeight();
if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
if (aspectoImg == aspectoPanel) {
largura = panel.getWidth();
altura = panel.getHeight();
}
if (aspectoImg > aspectoPanel) {
largura = panel.getWidth();
altura = (largura * alturaImg) / larguraImg;
}
if (aspectoImg < aspectoPanel) {
altura = panel.getHeight();
largura = (altura * larguraImg) / alturaImg;
}
}
else {
largura = image.getWidth();
altura = image.getHeight();
}
g2d.drawImage(image, 0, 0, largura, altura, null);
}
},
ASPECT_RATIO_CENTER {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
int larguraImg = image.getWidth(), alturaImg = image.getHeight();
int largura = 0, altura = 0;
double aspectoImg = (double) larguraImg / (double) alturaImg;
double aspectoPanel = (double) panel.getWidth() / (double) panel.getHeight();
if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
if (aspectoImg == aspectoPanel) {
largura = panel.getWidth();
altura = panel.getHeight();
}
if (aspectoImg > aspectoPanel) {
largura = panel.getWidth();
altura = (largura * alturaImg) / larguraImg;
}
if (aspectoImg < aspectoPanel) {
altura = panel.getHeight();
largura = (altura * larguraImg) / alturaImg;
}
}
else {
largura = image.getWidth();
altura = image.getHeight();
}
// centraliza a imagem no JPanel...
int left = (panel.getHeight() - altura) / 2;
int top = (panel.getWidth() - largura) / 2;
g2d.drawImage(image, top, left, largura, altura, null);
}
};
public abstract void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image);
}
}
2 - Agora, no seu JFrame, adicione um JPainel, dá um nome a ele (tipo JPanelFundo), defina seu layout como BorderLayout (importantíssimo isso) e redimensione-o para que fique de fundo do formulário...
3 - No código do JFrame crie um objeto BufferedImage para armazenar a imagem que quer visualizar e um JImagePanel para pintar a imagem ao JPanel:
private BufferedImage imagem = null;
private JImagePanel quadroImagem = null;
// ...
imagem := ImageIO.read(new File('/home/linkel/Imagens/imagem_fundo.jpg'));
if (quadroImagem == null) quadroImagem = new JImagePanel(imagem);
quadroImagem.setImage(imagem); // atualiza a imagem
JPanelFundo.add(quadroImagem); // envia a imagem ao JPanel
JPanelFundo.repaint(); // repinta o JPanel
JPanelFundo.validate(); // valida a visualizacao do JPanel
E pronto!
Lembrando que na classe JImagePanel tem várias opções de redimensionamento da imagem, algumas criadas pelo mestre ViniGodoy e outras por mim (as que calculam o ASPECT RATIO); para mudar é só alterar na classe JImagePanel a linha: private FillType fillType = FillType.ASPECT_RATIO_CENTER para o que você quiser, por exemplo:
private FillType fillType = FillType.SIDE_BY_SIDE;
// mantem as dimensões reais da imagem e a repete lado a lado
// até preencher toda a área do JPanel...
E assim por diante...
Tenta aí e me diz se conseguiu resolver seu problema...
Um abraço!