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;
}
}