Como colocar uma imagem de fundo jPanel no Netbeans – [Java]

Uma das coisas mais frustrantes ao usar o Netbeans é descobrir que nas propriedades do jPanel não há uma propriedade background-image, e colocar uma imagem no fundo do componente, quase sempre te leva a dar uma busca no Google 🙂

De acordo com a própria documentação no site da IDE, isso ocorre porque o próprio componente Swing não da suporte a imagem de fundo:

Não há nenhum suporte direto para uma imagem de segundo plano do JFrame no GUI Builder, já que não há nenhum suporte direto para uma imagem de segundo plano do JFrame no Swing.

https://netbeans.org/kb/docs/java/gui-image-display_pt_BR.html

A solução é. usar o método paintComponent(), do próprio jPanel, fazendo assim:

1. Criar uma classe java Ex. PainelImagemFundo:

Criando a classe PainelImagemFundo

2. Estender a classe jPanel e sobrescrever o método paintComponent():

import java.awt.Graphics;
import javax.swing.ImageIcon;

/**
 * @author Willian Bueno
 */
public class PainelImagemFundo extends javax.swing.JPanel{
    
    private ImageIcon img;
    
    public PainelImagemFundo(){
       img = new ImageIcon();
    }
    
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        
        g.drawImage(img.getImage(), 0, 0, this.getWidth(), this.getHeight(), this);
        
    }
    
    public void setImg(ImageIcon img){
        this.img = img;
    }
    
    public ImageIcon getImg(){
        return this.img;
    }
    
}

3. Clique com o botão direito na classe PainelImagemFundo.java > Ferramentas > Adiciona à paleta

Adicionar painel a paleta

4. Escolha Contêineres Swing:5. A classe deve aparecer na lista de componentes:

6. Execute o projeto (F6). Atenção! se tentar adicionar o painel antes de executar o projeto você verá um erro informando que a classe não foi encontrada.

7. Adicione o painel ao jFrame:

Arrastando o painel para o projeto.

8. Com o painel recém adicionado selecionado, clique nas reticências da propriedade img:

9. Mude para código personalizado:

10. E adicione o código:

new ImageIcon("src/images/imagem_fundo.jpg")

11. Pronto! Agora só importe a classe: javax.swing.ImageIcon, na classe onde está usando o painel:

import javax.swing.ImageIcon;

12. Altere o tamanho e posição do jPanel e execute o projeto:

Imagem no fundo do jPanel.

Dúvidas ou sugestões? Deixe seu comentário!

Autor da solução: Willian Bueno




Compartilhar:

14 Comentários

  1. Prezados
    Teria a possibilidade de incluir/trazer a imagem diretamente para o componente por meio de uma classe ao em vez de adicionar a paleta?

  2. Opa bom dia ! estou tendo o mesmo problema do Daniel, ao compilar o arquivo .jar a imagem não aparece.

    1. Substitui o código do item 10:
      new ImageIcon(“src/images/imagem_fundo.jpg”)

      por este:
      new ImageIcon(getClass().getResource(“/images/imagem_fundo.png”))

  3. Muito bom o artigo. Entretanto as Imagens perdem as referencias e somem apesar das imagens estarem dentro do .jar no “src”. Só consigo vê-las se colocar o link deste do C:\ até o local da imagem no WINDOWS. Entretanto quando mudo de máquina as imagens logicamente não estão mais disponível e somem. É um problema pra achar a forma correta apesar das imagens estarem dentro do JAR.

  4. Precisei mexer em um projeto antigo e esse exemplo seu foi perfeito. Como eu preciso de um evento de troca de imagem dentro do JPanel, ao inves de fazer a parte 10 igual você, eu coloquei direto no código

    imagemIcon.setImg(new ImageIcon(getClass().getResource(“/imagens/icon.png”)));

  5. nossa mas é PUNK esse java meu… puxa vida… no Delphi e no C# era mais facil de fazer essas coisas… vou tentar aqui… mas to levando muito tempo pra entender… obrigado pelas explicações!

  6. Olá. O método sugerido funciona. Porém, ao gerar o código .JAR a imagem de fundo desaparece. Alguém sabe como solucionar o problema?

  7. Boa tarde, não estou conseuindo colocar a imagem, ela não está aprecendo.
    No passo 10, “Adicione o código a imagem não do site não está aparecendo.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *