Abrir imagem em JLabel selecionada em um JFileChooser

Oi pessoal… Sou iniciante em Java e tenho uma dúvida… Preciso de abrir uma imagem em um JLabel com size de 450x300, e que essa imagem seja escolhida pelo usuário no sistema através de um JFileChooser, mas não sei manipula-los em conjunto… Sei que não é um local para pedir código pronto, más se alguem tivesse algum exemplo comentado, seria de grande valia, pois assim como eu, muitos devem ter essa dúvida…
E depois preciso armazenar essa imagem em um Banco de dados mySQL ja criado. Consigo conectar o Banco de dados e salvar os dados alfanumericos, mas a imagem n faço idei de como armazeno e nde erro no codigo…

Bons estudos e abs a todos

http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/filechooser.html#advancedexample

Pode ser assim:

    private ImageIcon selectFile() {
        ImageIcon conteudo = null;
        String caminho = null;
        try {

            JFileChooser jFileChooser = new JFileChooser();

            int ok = jFileChooser.showOpenDialog(null);

            if (ok == JFileChooser.APPROVE_OPTION) {

                caminho = jFileChooser.getCurrentDirectory().getPath() + "\" + jFileChooser.getSelectedFile().getName(); // caminho do arquivo

                conteudo = new ImageIcon(caminho);
                
                System.out.println(conteudo);
            } else {
                jFileChooser.cancelSelection();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conteudo;
    }

Usa esse método para carregar a imagem.
E no label que quer adicionar a imagem, faz assim

label.setSize(450, 300); 
label.setIcon(selectFile());

Boa tarde,

Estou te mostrando como escolher uma imagem pelo filechooser, salvar a imagem no banco e recupera-la em seguida.
Lembrando que o armazenamento de imagens no banco de dados nao é recomendavel caso vc va trabalhar com muitas imagens e/ou as imagens sejam em alta resolucao, ou ainda o fato de o servidor estar em outro computador pela rede.

Qualquer duvida posta, aê, tentei deixar o mais simples possivel…

Abraco! :thumbup:

[code]package testes;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

@SuppressWarnings(“serial”)
public class ImagemBanco extends JFrame{
public static Connection connection = null;
public static Statement statement = null;
public static ResultSet resultSet = null;
public static PreparedStatement pstmt = null;

public static void main(String[] args) {
	// TODO Auto-generated method stub
	new ImagemBanco().setVisible(true);
}
public ImagemBanco(){
	try{
		String banco="";
		/**
		 * Conectando ao BD
		 */			

		banco=("jdbc:mysql://localhost/BANCO_TESTE?user=root&password=123");			

		Class.forName("com.mysql.jdbc.Driver");
		connection= DriverManager.getConnection( banco );


		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setDialogTitle("Importar imagem");
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
		String caminhoImagem = null;
		int a = fileChooser.showOpenDialog(null);
		/**
		 *  Se a for igual a zero e porque o usuario clicou em salvar, se for 1 e porque clicou em cancelar
		 */
		if (a==0)
		{	

			caminhoImagem = fileChooser.getSelectedFile().getAbsolutePath();// Aqui estou pegando o nome do arquivo e o endereco dele  

			File input = new File(caminhoImagem);//Seleciona o arquivo do disco		

			//Aqui eu redimensiono a imagem a partir do file, 128x128 px  
			BufferedImage imageInput = ImageIO.read(input);  

			BufferedImage scaled = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2d = scaled.createGraphics();
			g2d.drawImage(imageInput, 0, 0, 128, 128, null);
			g2d.dispose();

			//Crie um ByteArrayOutputStream
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

			//Jogue a imagem lá dentro do byteArrayOutputStream
			ImageIO.write(scaled, "png", byteArrayOutputStream);
			
			//Prepara a sql e logo em seguida inser os bytes no campo parametrizado
			pstmt = connection.prepareStatement("INSERT INTO imagens values (0,?)");// o ? significa que ainda completareios parametros que faltam
			pstmt.setBytes(1, byteArrayOutputStream.toByteArray()); //Complemento agora, passando a posicao do parametro e o valor
			pstmt.executeUpdate();// Insiro no BD

			//Fazendo processo contrario e pegaremos a imagem do banco para exibir, primeiro vamos pegar qual foi ID gerada pela chave
			//primaria auto incremento.
			statement= connection.createStatement();
			resultSet= statement.executeQuery("SELECT DISTINCT LAST_INSERT_ID() FROM imagens");        
			resultSet.next();
			int id = resultSet.getInt(1);// Esse é a chave primaria do registro

			//Carregando o resultSet com a nossa busca
			resultSet = pstmt.executeQuery("SELECT * FROM imagens WHERE id="+id);
			resultSet.next();

			//Pegando a imagem (a partiri dos bytes que veio do banco) do registro pesquisado
			Image img = Toolkit.getDefaultToolkit().createImage(resultSet.getBytes(2));

			//Fechando a conexao
			connection.close();

			//Montando o imageIcon a partir do image
			ImageIcon imageIcon = new ImageIcon(img);
			
			//Criando o grafico para mostrar o resultado
			this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			setSize(160,172);
			this.setLayout(null);
			JLabel label = new JLabel();
			label.setIcon(imageIcon);
			label.setBounds(10,10,128,128);
			setLocationRelativeTo(null);
			this.add(label);
		}
		else{
			System.exit(0);
		}
	}
	catch(Exception ex){
		ex.printStackTrace();
		JOptionPane.showMessageDialog(null, "ERRO");
	}		
}

}[/code]

Para isso criei um banco chamado “BANCO_TESTE” com a seguinte tabela:
CREATE TABLE BANCO_TESTE.imagens (
id integer NOT NULL AUTO_INCREMENT,
imagen LONGBLOB NOT NULL,
PRIMARY KEY (id)
)
ENGINE = InnoDB;

Olá amigo!

implementei a classe conforme vc mostrou acima, e consegui gravar no banco de dados, mas na hora de mostrar a imagem ele mostra o label em branco o que poderia ser, onde está a falha na hora de mostrar a imagem?

segue o codigo ajustado para meu banco de dados:

[code] import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

@SuppressWarnings(“serial”)
public class ImagemBanco extends JFrame{
public static Connection connection = null;
public static Statement statement = null;
public static ResultSet resultSet = null;
public static PreparedStatement pstmt = null;

 public static void main(String[] args) {
     // TODO Auto-generated method stub
     new ImagemBanco().setVisible(true);
 }
 public ImagemBanco(){
     try{
         String banco="";
         /**
          * Conectando ao BD
          */

 banco=("jdbc:mysql://localhost/siscorjava?user=elgin&password=admin");

 Class.forName("com.mysql.jdbc.Driver");
 connection= DriverManager.getConnection( banco );


 JFileChooser fileChooser = new JFileChooser();
 fileChooser.setDialogTitle("Importar imagem");
 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
 String caminhoImagem = null;
 int a = fileChooser.showOpenDialog(null);

/**

  • Se a for igual a zero e porque o usuario clicou em salvar, se for 1 e porque clicou em cancelar
    */
    if (a==0)
    {

caminhoImagem = fileChooser.getSelectedFile().getAbsolutePath();// Aqui estou pegando o nome do arquivo e o endereco dele

File input = new File(caminhoImagem);//Seleciona o arquivo do disco

//Aqui eu redimensiono a imagem a partir do file, 128x128 px
BufferedImage imageInput = ImageIO.read(input);

BufferedImage scaled = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = scaled.createGraphics();
g2d.drawImage(imageInput, 0, 0, 128, 128, null);
g2d.dispose();

//Crie um ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

//Jogue a imagem lá dentro do byteArrayOutputStream
ImageIO.write(scaled, “png”, byteArrayOutputStream);

//Prepara a sql e logo em seguida inser os bytes no campo parametrizado
//pstmt = connection.prepareStatement(“INSERT INTO imagem values (?)”);// o ? significa que ainda completareios parametros que faltam
pstmt = connection.prepareStatement ( “insert into Imagem value(?,?,?,?)” ) ;
pstmt.setInt ( 1,0 ) ;
pstmt.setInt (2,1);
pstmt.setString ( 3 , “final” ) ;
//pre.setBinaryStream ( 4 , fin, ( int ) imgfile.length ()) ;
pstmt.setBytes(4, byteArrayOutputStream.toByteArray()); //Complemento agora, passando a posicao do parametro e o valor
pstmt.executeUpdate();// Insiro no BD

//Fazendo processo contrario e pegaremos a imagem do banco para exibir, primeiro vamos pegar qual foi ID gerada pela chave
//primaria auto incremento.
statement= connection.createStatement();
resultSet= statement.executeQuery(“SELECT DISTINCT LAST_INSERT_ID() FROM imagem”);
resultSet.next();
int cod_Imagem = resultSet.getInt(1);// Esse é a chave primaria do registro

//Carregando o resultSet com a nossa busca
resultSet = pstmt.executeQuery(“SELECT * FROM imagem WHERE ID=”+cod_Imagem);
resultSet.next();

//Pegando a imagem (a partiri dos bytes que veio do banco) do registro pesquisado
Image img = Toolkit.getDefaultToolkit().createImage(resultSet.getBytes(2));

//Fechando a conexao
connection.close();

//Montando o imageIcon a partir do image
ImageIcon imageIcon = new ImageIcon(img);

             //Criando o grafico para mostrar o resultado
             this.setDefaultCloseOperation(EXIT_ON_CLOSE);
             setSize(160,172);
             this.setLayout(null);
             JLabel label = new JLabel();
             label.setIcon(imageIcon);
             label.setBounds(10,10,128,128);
             setLocationRelativeTo(null);
             this.add(label);
         }
         else{
             System.exit(0);
         }
     }
     catch(Exception ex){
         ex.printStackTrace();
         JOptionPane.showMessageDialog(null, "ERRO");
     }

}

}[/code]

grava direitinho no banco de dados mas na hora de mostrar a imagem no label aparece o label em branco, alguma sujestão ou dica para mostrar a imagem, pois terei que gravar no banco 3 ou quatro imagens referente ao produto , talvez se conseguir gravar uma imagem e mostrar ela na label quando o usuario selecionar, tentarei criar mais labels para gravar outra imagens e quando selecionar o produto ele me mostre as imagens gravadas no banco referente a este produto.

vc pode me ajudar

Agradeço a dica anteriormente e aguardo uma ajuda.

Um abraço.