Redimensionar imagem

3 respostas
P

Olá!

Gostaria de saber como faço para que uma imagem pequena seja automaticamente redimensionada em um JPanel ocupando TODO o seu espaço? Igual quando se insere um objeto num BorderLayout.CENTER e o objeto é redimensionado ocupando toda a área! Se eu uso um JLabel com a imagem e adiciono no painel o JLabel é redimensionado mas a imagem fica pequena! Alguma dica?

Obrigado.

3 Respostas

fabiofalci

Olha esse codigo ai

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * @author fabiofalci
 */
public class MyPanel extends JPanel {

    private Image image;

    public MyPanel() {
        this.initialize();
    }

    protected void initialize() {
        this.image = this.getImage("background.gif");
        
        this.setLayout(new BorderLayout());
        
        this.add(new JLabel("www.guj.com.br"), BorderLayout.NORTH);
        this.add(new JLabel("www.portaljava.com.br"), BorderLayout.SOUTH);
    }

    public Image getImage(String path) {
        URL imageURL = getClass().getResource(path);
        if (imageURL == null)
            return null;

        return new ImageIcon(imageURL).getImage();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Dimension dDesktop = this.getSize();

        double width = dDesktop.getWidth();
        double height = dDesktop.getHeight();

        Image background = new ImageIcon(this.image.getScaledInstance(
                (int) width, (int) height, 1)).getImage();

        g.drawImage(background, 0, 0, this);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new MyPanel());
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}
A

fabio eu sou iniciante em java e no forum, eu gostaria de saber se tem como eu fazer esse exemplo extendendo de um jframe,
te agradeço muito se puder me ajudar!

C
import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {
    private BufferedImage bi;
    private JLabel jLabel_Imagem;

    public Main() {
        JFileChooser jFileChooser = new JFileChooser();
        jFileChooser.showOpenDialog(null);
        File arquivo = jFileChooser.getSelectedFile();//arquivo

        try {
            bi = ImageIO.read(arquivo); //carrega a imagem real num buffer
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        //cria um jlabel
        jLabel_Imagem = new JLabel();

        //adiciona a acao de resized
        jLabel_Imagem.addComponentListener(new ComponentListener() {
            public void componentResized(ComponentEvent e) {
                atualizarJLabel();
            }

            public void componentMoved(ComponentEvent e) {
            }

            public void componentShown(ComponentEvent e) {
            }

            public void componentHidden(ComponentEvent e) {
            }
        });

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(BorderLayout.CENTER, jLabel_Imagem);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void atualizarJLabel() {
        if (jLabel_Imagem.getSize().width == 0 || jLabel_Imagem.getSize().height == 0) return;
        BufferedImage aux = new BufferedImage(jLabel_Imagem.getSize().width, jLabel_Imagem.getSize().height, bi.getType());//cria um buffer auxiliar com o tamanho desejado
        Graphics2D g = aux.createGraphics();//pega a classe graphics do aux para edicao
        AffineTransform at = AffineTransform.getScaleInstance((double) jLabel_Imagem.getSize().width / bi.getWidth(), (double) jLabel_Imagem.getSize().height / bi.getHeight());//cria a transformacao
        g.drawRenderedImage(bi, at);//pinta e transforma a imagem real no auxiliar
        jLabel_Imagem.setIcon(new ImageIcon(aux));// seta no jlabel
    }
    
    public static void main(String[] args) {
        //teste
        new Main();
    }

}
Criado 11 de abril de 2006
Ultima resposta 24 de mar. de 2011
Respostas 3
Participantes 4