Abrir imagem em JLabel selecionada em um JFileChooser

4 respostas
adriano_kahn

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

4 Respostas

E

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

romarcio

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());
gqferreira

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:

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");
		}		
	}
}

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;

R

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:

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");
         }
   }

 }

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.

Criado 26 de julho de 2010
Ultima resposta 25 de abr. de 2011
Respostas 4
Participantes 5