Imagen no fundo do projeto

4 respostas
F

Boa noite…

Não estou conseguindo inserir uma imagem no fundo do projeto(JFrame).
Tentei com a propriedade icon do jLabel, mas ai não consigo colocar outros componentes sobre a imagem…

Algem tem uma idéia de como deixar a imagem no fundo do projeto?

Grato…

4 Respostas

Linkel

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!

F

Obrigado pela dica, mas tenho alguns problemas.

Estou utilizando o Netbeans.
A imagem esta no "package com.imagens;"
Na 3º Parte ficaria assim?

import com.servicos.JImagePanel;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

public class TelaPrincipal extends javax.swing.JFrame {

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
/** Creates new form TelaPrincipal */

O Netbeans pede para criar a classe imagem, quadroImagem… qual codigo iria nestas classes?
Derepente são problemas simples mas tenho dificuldades com o java pois trabvalhei com o delphi muito tempo e estou migrando agora…

Grato…

Linkel

Fera, eu também já trabalhei com Delphi e infelizmente ainda trabalho num último projeto que devo estar terminando amanhã.
Eu também uso o Netbeans para programar Java e tudo o que eu te passei foi nele que eu fiz.
Você está confundindo algumas coisas. Vejamos:

  • Você criou a classe com o nome de JImagePanel com o código que eu te passei?
  • O primeiro import que você definiu está errado; ele não deve existir…
  • O código para pintar a imagem no JPanel deve ser inserido num evento que se dispara na abertura do seu JFrame, como por exemplo: WindowOpened()…
  • No seu caso, a imagem já estará no classpath e é só chamar ela diretamente…
F

A classe JImagePanel foi criada em: “package com.servicos;” //Compilou sem erros

O projeto com a tela inicial esta em:“package com.telas;”

import com.servicos.JImagePanel; //Importado o JImagePanel

E a Imagem esta em: “package com.imagem;” // Nome da imagem: Mapa.jpg

Até aqui esta tranquilo…

Tenho problemas do item 3 de seua explicação…
E no item 2 é apenas para dimencionar o JPanel no tamanho total do JFrame?

Grato…

Criado 29 de outubro de 2008
Ultima resposta 31 de out. de 2008
Respostas 4
Participantes 2