JFileChooser + JLabel + Imagem

Ola pessoal…
o amigo Gustavo me passou o seguinte codigo

[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]

So que eu gostaria de usar um JFrame com um Jbutton para que o JfileChooser abaixo apareça qdo pressionar o Jbutton (que estra localizado no Jframe criado anteriormente com o settitle(“Carregar”)) e quando selecionar a imagem no JFileChooser, ela apareca no JLabel que estara localizado no JFrame criado, só que essa parte do banco de dados que esta no codigo nao me interessa nessa parte do programa e sim posteriormente qdo tds os dados estiverem preenchidos e eu nao consigo abrir a imagem sem q de erro em algo relacionado ao banco de dados implementado no codigo… ou seja… quero tirar a parte de banco de dados do codigo e fazer as implementações visuais sitadas acima… Espero q possam me ajudar…

Abs e bons estudos a tds

E você não consegue ler, entender e adaptar?

Viny… sou iniciante, entao tenho bastante dificuldade ainda, ate por isso qdo peço ajuda, peço q se possivel comente bem os códigos para que eu possa entender melhor. Entao no atual estágio de aprendizado em q estou, necessito de toda a ajuda possivel…

Abs e Bons estudos

Sim, mas onde exatamente está sua dúvida?

Já sabe montar o JFileChooser?
Ou carregar a imagem no JLabel?

Oi, por favor, responda aqui no seu tópico, não via MP.

Você pode postar então o que você tentou fazer?

É o seguinte…
pedi uma ajuda, pois gostaria de armazenar uma imagem em um campo BLOB no meu Banco de dados, que é constituído de Nome, Telefone, RG, CPF e Foto. Só que no JFrame de Cadastro eu quero colocar 4 JText para receber Nome, Telefone, RG e CPF, além de um botão com o titulo “Carregar”, para que quando eu estivesse cadastrando o cliente eu pressionasse esse botão Carregar e aparecesse um JFileChooser, aonde eu selecionaria uma imagem, preferencialmente JPG, e dentro do JFrame de cadastro existe um JLabel para receber a imagem que fosse selecionada a partir da escolha feita dentro do JFileChooser, tudo isso sem usar o Banco de Dados… E após o cadastro feito, o JFrame possuirá um botão entitulado “Gravar”, aonde estaria a conexão com o banco, para que a gravação seja feita… É mais ou menos isso, mas eu quero ir passo a passo…

Obrigado a todos e bons estudos!!!

É adriano kahn já reclamei aqui tb desse fato, ainda bem que não preciso mais da ajuda desse fórum!

Como é mesmo que excluo minha conta?

Então, no método do seu botão, você põe:

[code]//Criação do FileChooser
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle(“Importar imagem”);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

//Abre a caixa para escolher a imagem
if (fileChooser.showOpenDialog(this) != JOptionPane.APPROVE_OPTION)
return;

//Agora, carregamos a imagem selecionada num JLabel
seuLabel.setIcon(new ImageIcon(fileChooser.getSelectedFile());
[/code]

Para a gravação passo-a-passo, você pode obter a imagem que está dentro do JLabel com o comando:

Image image = ((ImageIcon)suaLabel.getIcon()).getImage();

Depois é só usar o código que já está no seu post para gravar no banco.

[quote=Jingo]É adriano kahn já reclamei aqui tb desse fato, ainda bem que não preciso mais da ajuda desse fórum!
Como é mesmo que excluo minha conta?[/quote]

Engraçado, olhando o seu histórico, deu pra ver que em boa parte dos seus tópicos você foi muito bem ajudado. Por que ao invés de entrar aqui só para reclamar, você não ajudou o colega?

Não existe a opção de excluir conta. Simplesmente pare de frequentar o fórum. Eu vou continuar ajudando gente por aqui, e pela freqüência e a atividade das pessoas do fórum, tenho certeza de que estamos fazendo um ótimo trabalho.

É bom lembrar que ninguém aqui tem a obrigação de responder a dúvidas, muito menos de dar códigos fontes completos, compilados e testados. O fórum é um local para trocar idéias e experiências. Quando percebo que o usuário é iniciante eu, pelo menos, tento estimula-lo a aprender e entender o que está fazendo, não simplesmente entregar uma solução.

Eu jamais pegaria o código pronto, só seu eu quisesse matar minha aplicação; nunca vi tanta gambiarra.

E vê se conserta esse fórum e coloca uma opção de exclusão, não entendo qual é a dificuldade de fazer algo tão simples, precisa de ajuda? Faz um tópico: “Como adicionar a função de exclusão de perfil?”.

[quote=Jingo]Eu jamais pegaria o código pronto, só seu eu quisesse matar minha aplicação; nunca vi tanta gambiarra.

E vê se conserta esse fórum e coloca uma opção de exclusão, não entendo qual é a dificuldade de fazer algo tão simples, precisa de ajuda? Faz um tópico: “Como adicionar a função de exclusão de perfil?”.[/quote]

Eu não programo o fórum. O GUJ usa o JForum.
Se você não gosta dessa característica, pode se tornar um implementador do projeto e atualiza-lo.

Não entendi ainda, fora o fato de não poder excluir a conta, qual é a sua reclamação? Está nervoso com o que?

Num tô nervoso… tô sussa.

Agora é culpa do JForum…

[quote=Jingo]É adriano kahn já reclamei aqui tb desse fato, ainda bem que não preciso mais da ajuda desse fórum!

Como é mesmo que excluo minha conta?[/quote]

Ok, então do que você está falando? E por que quer excluir sua conta?

Não é questão de ser ou não ser culpa do JForum. A questão é que eu tenho tanta autonomia para corrigir o GUJ quanto você.

Oi Viny…
carregar o filechooser foi tranks mas o Jlabel n mostra a imagem…
eu tenho de usar o codigo abaixo

//Agora, carregamos a imagem selecionada num JLabel seuLabel.setIcon(new ImageIcon(fileChooser.getSelectedFile());

na sequencia que vc passou dentro do evento do botão carregar né…?

abs e bons estudos

Sim. Ah, acabei de ver, não tem um construtor que aceita um file.

Basta fazer assim, então:

seuLabel.setIcon(new ImageIcon(fileChooser.getSelectedFile().getPath()); 

ainda ta dando um erro na seguinte linha

[code]if (fileChooser.showOpenDialog(this) != JOptionPane.APPROVE_OPTION)[code]

e os resultados dos erros são os seguintes:

run:
Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code - incompatible types
required: boolean
found: int
at bancoswing1.Principal.jButton_CarregarActionPerformed(Principal.java:122)
at bancoswing1.Principal.access$200(Principal.java:23)
at bancoswing1.Principal$3.actionPerformed(Principal.java:63)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 11 segundos)

obrigado e sucesso a todos

oi Viny…
o Codigo esta da seguinte maneira…

[code]private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle(“Importar imagem”);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

    if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION)
    {
        return;
        jLabel1.setIcon(new ImageIcon(fileChooser.getSelectedFile().getPath()));
    }
}[/code]

Só que aparece o seguinte erro na linha

jLabel1.setIcon(new ImageIcon(fileChooser.getSelectedFile().getPath()));

Unreachable Stamement

procurei por esse erro e alguns disseram que pode ocorrer se a linha não vier depois de um return, o q n á o caso…

Obrigado e bons estudos

Viny… Muito obrigado… Finalmente consegui com o seguinte código abaixo…

[code]private void jButton_CarregarActionPerformed(java.awt.event.ActionEvent evt) {
//Criação do FileChooser
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle(“Importar imagem”);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
// int a = fileChooser.showOpenDialog(null);

    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
    {
        //return;
        jLabel1.setIcon(new ImageIcon(fileChooser.getSelectedFile().getPath()));
    }

//Abre a caixa para escolher a imagem

}    [/code]

Fiz algumas alterações em relação ao código que vc me enviou, mas seu código foi de grande valia…
Com essas alterações que fiz, esse código descrito acima possui alguma coisa que pode dar errado, ou algo a mais que eu tivesse que implementar?

Obrigado e bons estudos!!!

agora o que esta matando é a conexao com o banco…
pois meu codigo no banco se encontra dessa maneira descrita abaixo:

[code]
private void jButton_GravarActionPerformed(java.awt.event.ActionEvent evt) {
//fazer a conexao com o mysql
java.sql.Connection con;
try
{
Class.forName(“org.gjt.mm.mysql.Driver”);
con = java.sql.DriverManager.getConnection(“jdbc:mysql://localhost:3306/db_aulas”, “root”,“123”);
}
catch (Exception e)
{
e.printStackTrace();
throw new java.lang.RuntimeException(“erro ao conectar”);
}

    //Inserindo Dados
    String nome = this.jTextField_Nome.getText();
    String telefone = this.jTextField_Telefone.getText();
    String rg = this.jTextField_RG.getText();
    String cpf = this.jTextField_CPF.getText();
   
    

    String comando = "insert into Cliente (nome, telefone, rg, cpf) " +
    "values " + "('"+nome+"','" +telefone+"','"+ rg+"','" +cpf+"','"+imagem+"')";

    try
    {
        java.sql.Statement stmt = con.createStatement();
        stmt.executeUpdate(comando);
        stmt.close();
        con.close();
    }
    catch(java.sql.SQLException e)
    {
        throw new java.lang.RuntimeException(e.getMessage());
    }



    //Fechando a Conexão:
    try
    {
        con.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        throw new java.lang.RuntimeException("erro fechar");
    }

    JOptionPane.showMessageDialog(null, "Registro Gravado com sucesso!");

    
}  [/code]

Só que nunca usei o tipo imagem para gravar no Banco…
se puderem me ajudar, sera de grande valia…

Obrigado e boa tarde a todos

Só corrigindo seu código:

private void jButton_CarregarActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        //Criação do FileChooser
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("Importar imagem");
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

        //Abre a caixa para escolher a imagem
        if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
            return;            
        }
        jLabel1.setIcon(new ImageIcon(fileChooser.getSelectedFile().getPath()));
}

Quanto ao do banco, tente adaptar o que você mesmo postou. Todos os passos para gravar imagem estão ali. Note que ele usar PreparedStatement, e não Statement, como eu já te recomendei em outros tópicos.

Fazer concatenação na String do SQL (isso é, usar aquele sinal de +) é altamente prejudicial. Não só a sintaxe fica mais confusa, como seu programa pode dar erro caso o usuário use aspas simples na string dele. Você também fica dependente da String do formato de data do banco e não pode trabalhar com campos BLOB (como o da imagem).