Desenhar bufferedimage em painel

7 respostas
Z

Bom dia, pessoal :smiley:

Tenho um JPanel personalizado que contém o seguinte código:

package view;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class PainelMostraImagem extends JPanel{
	
	private BufferedImage imagem;
	
	public PainelMostraImagem(BufferedImage imagem){
		
		this.imagem = imagem;
	}
	
	@Override  
	public void paintComponent(Graphics g){
		
		super.paintComponents(g);
		
		Graphics2D g2d = (Graphics2D) g.create();
		
		g2d.drawImage(imagem, 0, 0, imagem.getWidth(), imagem.getHeight(),this);
		
		g2d.dispose();
		
		
	}

}

Na tela principal do programa, tenho um botão que carregar uma imagem e criar uma BufferedImage e passa essa imagem para o seguinte método da tela principal

public void setImagem(final BufferedImage imagem){
		
		PainelMostraImagem painel = new PainelMostraImagem(imagem);
		
		scrollPane = new JScrollPane(painel);
		
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		this.repaint();
		
					
	}

Porém a imagem não está aparecendo :cry: , so aparece quando maximizo a janela e pior, não aparece o scrollpane da tela (fica estourado) :lol:

O que preciso fazer para que esse painel seja colocado dentro do scrollpane e o mesmo seja redesenhado pela tela ?

abs :wink:

7 Respostas

E

1 Use http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html
2Além do repaint, use revalidate().
3Dá onde tá vindo essa imagem? Já debugou pra ver se num tá vazia?

V

Sobrescreva o método getPreferredSize() do seu painel para retornar o tamanho da imagem também.

Ou use uma implementação já pronta, como esta:

G

Se você quer um simples visualizador de imagens, acredito que deveria fazer como nesta classe.

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;

public class TestandoCarregamentoDeImagens extends JFrame {

    public static void main(String[] args) throws HeadlessException, IOException {
        new TestandoCarregamentoDeImagens().setVisible(true);
    }
    private JScrollPane scrollPane = new JScrollPane();
    private JButton botao = new JButton("Coloca imagem.");
    private JFileChooser chooser = new JFileChooser();
    FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");

    public TestandoCarregamentoDeImagens() throws HeadlessException {
        configure();
    }

    private void clicaBotao(ActionEvent evt) throws IOException {
        int c = chooser.showOpenDialog(null);
        if (c == JFileChooser.APPROVE_OPTION) {
            scrollPane.setViewportView(new JLabel(new ImageIcon(chooser.getSelectedFile().getAbsolutePath())));
        }
    }

    private void configure() {
        chooser.setFileFilter(filter);
        botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
        this.getContentPane().add(botao, BorderLayout.NORTH);
        this.getContentPane().add(scrollPane, BorderLayout.CENTER);
        this.setDefaultCloseOperation(3);
        this.setSize(400, 400);
        this.setLocation(200, 100);
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                try {
                    clicaBotao(evt);
                } catch (IOException ex) {
                    Logger.getLogger(TestandoCarregamentoDeImagens.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

    }
}
G
ViniGodoy:
Sobrescreva o método getPreferredSize() do seu painel para retornar o tamanho da imagem também.

Ou use uma implementação já pronta, como esta:
https://github.com/MarkyVasconcelos/Towel/blob/master/src/com/towel/swing/img/JImagePanel.java

ViniGodoy, aproveitando a dúvida do colega eu criei mais duas classes baseadas inclusive em um artigo seu.
[url]http://pontov.com.br/site/java/48-java2d/111-trabalhando-com-imagens[/url]

Realmente as barras de rolagem do scrollPane não aparecem!!!

Eis a pergunta, esse comportamento é normal no scrollPane? Ou falta algum ajuste nestes códigos??? Os conteines (JPanel e outros) não podem ser setados no ViewportView, o scrollPane simplesmente ignora a presença do conteiner JPanel e não ativa as barras de rolagem???? Para esse tipo de aplicação é mais indicado o uso do Jlabel juntamente com o ImageIcon???

Abaixo as outras duas classes que comprovam essa afirmação.

Desde já, obrigado pela resposta.

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;

public class TestandoCarregamentoDeImagens2 extends JFrame {

    public static void main(String[] args) throws HeadlessException, IOException {
        new TestandoCarregamentoDeImagens2().setVisible(true);
    }
    private JScrollPane scrollPane = new JScrollPane();
    private JButton botao = new JButton("Coloca imagem.");
    private JFileChooser chooser = new JFileChooser();
    FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");

    public TestandoCarregamentoDeImagens2() throws HeadlessException {
        configure();
    }

    private void clicaBotao(ActionEvent evt) throws IOException {
        int c = chooser.showOpenDialog(null);
        if (c == JFileChooser.APPROVE_OPTION) {
            scrollPane.setViewportView(new PainelCarregaImagem(chooser.getSelectedFile().getAbsolutePath()));
        }
    }

    private void configure() {
        chooser.setFileFilter(filter);
        botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
        this.getContentPane().add(botao, BorderLayout.NORTH);
        this.getContentPane().add(scrollPane, BorderLayout.CENTER);
        this.setDefaultCloseOperation(3);
        this.setSize(400, 400);
        this.setLocation(200, 100);
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                try {
                    clicaBotao(evt);
                } catch (IOException ex) {
                    Logger.getLogger(TestandoCarregamentoDeImagens2.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

    }
}

Classe utilizada acima...

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class PainelCarregaImagem extends JPanel {

    private Image imagem;

    public PainelCarregaImagem(String path) {
        this.imagem = Toolkit.getDefaultToolkit().createImage(path);
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
          g.drawImage(imagem, 0, 0, this);
    }
}

Outra classe que demonstra esse contexto...

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;

public class TestandoCarregamentoDeImagens3 extends JFrame {

    public static void main(String[] args) throws HeadlessException, IOException {
        new TestandoCarregamentoDeImagens3().setVisible(true);
    }
    private JScrollPane scrollPane = new JScrollPane();
    private JButton botao = new JButton("Coloca imagem.");
    private JFileChooser chooser = new JFileChooser();
    FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");

    public TestandoCarregamentoDeImagens3() throws HeadlessException {
        configure();
    }

    private void clicaBotao(ActionEvent evt) throws IOException {
        int c = chooser.showOpenDialog(null);
        if (c == JFileChooser.APPROVE_OPTION) {
            BufferedImage image = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            scrollPane.setViewportView(new PainelCarregaImagem2(image));
        }
    }

    private void configure() {
        chooser.setFileFilter(filter);
        botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
        this.getContentPane().add(botao, BorderLayout.NORTH);
        this.getContentPane().add(scrollPane, BorderLayout.CENTER);
        this.setDefaultCloseOperation(3);
        this.setSize(400, 400);
        this.setLocation(200, 100);
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                try {
                    clicaBotao(evt);
                } catch (IOException ex) {
                    Logger.getLogger(TestandoCarregamentoDeImagens3.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

    }
}

Classe utilizada acima...

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class PainelCarregaImagem2 extends JPanel {

    private BufferedImage imagem;

    public PainelCarregaImagem2(BufferedImage imagem) {
        this.imagem = imagem;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawImage(imagem, 0, 0, imagem.getWidth(), imagem.getHeight(), this);
        g2d.dispose();
    }
}
V

Como já falei no primeiro post, sobrescreva o método getPreferredSize(). É nele que o JScrollPane se baseia para determinar se vai ou não colocar barras de rolagem.

Antes de usar um componente, convém ler a documentação dele: http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html

Ela é bem específica quanto a isso.

G

ok, Vini! vou seguir sua recomendação.

G

Funcionou agora… Valeu pela dica.

Criado 6 de outubro de 2012
Ultima resposta 8 de out. de 2012
Respostas 7
Participantes 4