Imagem de fundo em um JPanel

JBackgroundPanel

Perguntaram-me como colocar uma imagem de fundo em um JPanel no Java Swing. As duas principais alternativas, pelo que vi, são utilizar uma JLabel com ícone personalizado, ou modificar o método paintComponent da classe JPanel. Preferi a segunda, e fiz uma classe para facilitar a utilização:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class JBackgroundPanel extends JPanel {
    protected BufferedImage backgroundImage = null;

    public JBackgroundPanel() {
        super();
    }

    public JBackgroundPanel(BufferedImage backgroundImage) {
        super();
        setBackgroundImage(backgroundImage);
    }

    public JBackgroundPanel(URL url) throws IOException {
        super();
        setBackgroundImage(url);
    }

    public JBackgroundPanel(String resourceLocation) throws IOException {
        super();
        setBackgroundImage(resourceLocation);
    }

    public void setBackgroundImage(BufferedImage img) {
        this.backgroundImage = img;
    }

    public void setBackgroundImage(URL url) throws IOException {
        this.backgroundImage = ImageIO.read(url);
    }

    public void setBackgroundImage(String resourceLocation) throws IOException {
        URL backgroundUrl = getClass().getResource(resourceLocation);
        this.backgroundImage = ImageIO.read(backgroundUrl);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (backgroundImage != null) {
            g.drawImage(backgroundImage, 0, 0, this.getWidth(), this.getHeight(), null);
        }
    }
}

Você pode passar a imagem de fundo através de um dos métodos construtores, ou através do método setBackgroundImage (não se esqueça de chamar o método repaint, nesse caso). Tanto o método construtor quanto o setBackgroundImage vem em três versões:

    // via BufferedImage
    JBackgroundPanel panel = new JBackgroundPanel(ImageIO.read(getClass().getResource("/background.jpg")));

    // via URL
    JBackgroundPanel panel = new JBackgroundPanel(getClass().getResource("/background.jpg"));

    // via String
    JBackgroundPanel panel = new JBackgroundPanel("/background.jpg");

Se a imagem de fundo for ser trocada, dê preferência ao primeiro método, para não carregar a mesma imagem várias vezes desnecessariamente.

Uma resposta em “Imagem de fundo em um JPanel

  1. Evandro legal, mas esse código não está completo, está? O JButtonNext… Cheguei aqui pesquisando para tentar fazer uma ideia que tive em Java, mas conseguir parcialmente kkk… se puder visitar o meu blog seria bom… Quer compartilhar a ideia?

    Curtir

Deixe um comentário