Ajuda com image

tenho o codigo


FileInputStream fis = new FileInputStream(file);
stmt.setBinaryStream(6, fis, (int)file.length());  
aqui cadastro no banco

para recuperar faço o seguinte

Image img = Toolkit.getDefaultToolkit().createImage(rs.getBytes("foto_cliente")); 
           cli.setFoto_Cliente(img); 

seto o Foto_Cliente com a imagem porem quando vou consultar nao da erro simplismente para todo o programa trava tudo alguma sujestao

meu get e set

  private Image Foto_Cliente;

   public Image getFoto_Cliente()  {
        return Foto_Cliente;       
    }
      
          public void setFoto_Cliente(Image Foto_Cliente) { 
        this.Foto_Cliente = Foto_Cliente;     
    }

O arquivo fisico é grande?

 public Image getImagens(Integer id) throws SQLException, FileNotFoundException, IOException {   

          String sql = "SELECT foto_cliente FROM Cliente WHERE id_cliente = ?";
  PreparedStatement stmt = getConexao().prepareStatement(sql); 
  
 stmt.setInt(1, id); 
ResultSet rs = stmt.executeQuery();       


  byte[] imgBytes = rs.getBytes("foto_cliente");               
    OutputStream out = new FileOutputStream("arquivo.jpg");     
     out.write(imgBytes);   
                out.close();   
     System.out.println("Tamanho da imagem: " + imgBytes.length);   
  
        imagem = Toolkit.getDefaultToolkit().createImage(imgBytes); // recupera um array de bytes e cria uma images   
         
return imagem;
 }

essa funcao nao da erro porem nao retorna a imagem fiz isso aqui

jButton2.setIcon(new ImageIcon(clienteD.getImagens((2))));   e nao seta o icone com a imagem
porem se eu usar essa funcao

   public Image getImagens(Cliente cli) throws SQLException, FileNotFoundException, IOException {   

          String sql = "SELECT foto_cliente FROM Cliente WHERE id_cliente = ?";
  PreparedStatement stmt = getConexao().prepareStatement(sql); 
 
  
 stmt.setInt(1, cli.getid_Cliente()); 
ResultSet rs = stmt.executeQuery();   

               
          if (rs.next()){   
             byte[] imgBytes = rs.getBytes(1);   
                OutputStream out = new FileOutputStream("arquivo.jpg");   
                   
                out.write(imgBytes);   
                out.close();   
                System.out.println(out);               
      
      System.out.println("Tamanho da imagem: " + imgBytes.length);   
      
   }
           
File sourceimage = new File("arquivo.jpg");
     imagem = ImageIO.read(sourceimage);


      cli.setFoto_Cliente(imagem);
   rs.close();      
       
stmt.close();   
  return imagem;
  
 }  


e chamar assim          
   jButton2.setIcon(new ImageIcon(clienteD.getImagens(lista.get(2))));   

ai ele cria o arquivo no disco corespondente a o 2º cliente como na funcao anteriormente e ai sim funciona porem nao quero criar arquivo quero fazer direto alguem sujera alguma coisa ?????????

Você já tentou fazer dessa forma:

   public ImageIcon getImagens(Cliente cli) throws SQLException {   

          String sql = "SELECT foto_cliente FROM Cliente WHERE id_cliente = ?";
  PreparedStatement stmt = getConexao().prepareStatement(sql); 
   
 stmt.setInt(1, cli.getid_Cliente()); 
ResultSet rs = stmt.executeQuery();   
ImageIcon imagem = null;
               
          if (rs.next()){   
             imagem = new ImageIcon(rs.getBytes(1));
   }
   rs.close();      
       
stmt.close();   
  return imagem;
  
 }  

Para usar:

   jButton2.setIcon(clienteD.getImagens(lista.get(2)));   

exatamente isso cara mas como tudo nada é prefeito POREM so funciona se estiver cadastrado no bannco um GIF somente com gif mas funciona perfeito fiquei 2 dias mechendo nisso e nao iria conseguir sem ajuda ,

muito obrigado pela ajuda!!!

Disponha. Mas quanto ao formato, tem certeza que é só com gif que funciona? Olha a documentação do construtor ImageIcon:

Deveria funcinar com GIF, PNG e JPEG…

olha so cara o negocio aqui


 jButton2.setIcon(clienteD.getImagen(4));
fazendo isso funciona seta perfeito pegando do banco

mas seguinte

   private void preencheTabelaNomeCliente(){
         DefaultTableModel modelo = new javax.swing.table.DefaultTableModel(
             
            new Object  [][]  { },
            new String [] {"Código", "Nome", "Estado", "CPF", "Data", "Foto"}
        );
                       
      final ClienteDao clienteD = new ClienteDao();
   
   tabela.setModel(modelo);
    List<Cliente> lista = clienteD.listar(campo_pra_pesquisaNome.getText());//aqui pega o campo por parametro pra pesquiza
           
            // jButton2.setIcon(new ImageIcon("C:\teste\excluir.gif"));            
            // jButton2.setIcon(new ImageIcon(clienteD.getImagens((2))));
            jButton2.setIcon(clienteD.getImagen(4));
     
    
    tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);   
    tabela.getColumnModel().getColumn(0).setPreferredWidth(50);  
    tabela.getColumnModel().getColumn(1).setPreferredWidth(140);    
     tabela.getColumnModel().getColumn(2).setPreferredWidth(45);     
       tabela.getColumnModel().getColumn(3).setPreferredWidth(100);
       tabela.getColumnModel().getColumn(4).setPreferredWidth(240);
     tabela.getColumnModel().getColumn(5).setPreferredWidth(220);
  
    tabela.setRowHeight(100); 
     
   
String data = ("EEEE, dd 'de' MMMM 'de' yyyy, HH:mm:ss");
String dataFormatada ;
SimpleDateFormat formata = new SimpleDateFormat(data);  

  for(   final Cliente cli:lista) {  
    
    tabela.getColumnModel().getColumn(5).setCellRenderer(new DefaultTableCellRenderer(){   
    public Component getTableCellRendererComponent(JTable table,   
            Object value,   
            boolean isSelected,   
            boolean hasFocus,   
            int row,   
            int column){   
        this.setOpaque(true);   
        this.setText(value.toString());   
                                
      this.setIcon(new ImageIcon(clienteD.getImagen(4)));   //AQUI DA ERRO NO ImageIcon cannot find symbol

    
        return this;   
    }   
}); 
  
dataFormatada = formata.format(cli.getData_Cliente()); 

        modelo.addRow(new String[] {
                       
            cli.getid_Cliente().toString(), 
            cli.getNome_Cliente(), 
            cli.getEstado_Cliente(), 
            cli.getCpf_Cliente(),
            dataFormatada,
           // cli.getData_Cliente().toString(), 
            "", 
    
        });
       
        
    }
} 

essa funcao constroi uma tabela e coloca a imagem do banco no jtable porem da erro aqui
this.setIcon(new ImageIcon(clienteD.getImagen(4)));

Não precisa chamar o construtor de ImageIcon, porque o método getImagen já retorna um objeto dessa classe. Basta usar:

this.setIcon(clienteD.getImagen(4));

isso mesmo cara valeu denovo so o negocio aqui minha jtable

  private void preencheTabelaNomeCliente(){
         DefaultTableModel modelo = new javax.swing.table.DefaultTableModel(
             
            new Object  [][]  { },
            new String [] {"Código", "Nome", "Estado", "CPF", "Data", "Foto"}
        );
                       
      final ClienteDao clienteD = new ClienteDao();
   
   tabela.setModel(modelo);
    List<Cliente> lista = clienteD.listar(campo_pra_pesquisaNome.getText());//aqui pega o campo por parametro pra pesquiza
           
        try {
            //aqui pega o campo por parametro pra pesquiza
            // jButton2.setIcon(new ImageIcon("C:\teste\excluir.gif"));
            // jButton2.setIcon(new ImageIcon(clienteD.getImagens((2))));
            jButton2.setIcon(clienteD.getImagen((4)));
        } catch (SQLException ex) {
            Logger.getLogger(ConsultarCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
     
    
    tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);   
    tabela.getColumnModel().getColumn(0).setPreferredWidth(50);  
    tabela.getColumnModel().getColumn(1).setPreferredWidth(140);    
     tabela.getColumnModel().getColumn(2).setPreferredWidth(45);     
       tabela.getColumnModel().getColumn(3).setPreferredWidth(100);
       tabela.getColumnModel().getColumn(4).setPreferredWidth(240);
     tabela.getColumnModel().getColumn(5).setPreferredWidth(220);
  
    tabela.setRowHeight(100); 
     
   
String data = ("EEEE, dd 'de' MMMM 'de' yyyy, HH:mm:ss");
String dataFormatada ;
SimpleDateFormat formata = new SimpleDateFormat(data);  

  for(    final Cliente cli:lista) {  
    
    tabela.getColumnModel().getColumn(5).setCellRenderer(new DefaultTableCellRenderer(){   
    public Component getTableCellRendererComponent(JTable table,   
            Object value,   
            boolean isSelected,   
            boolean hasFocus,   
            int row,   
            int column){   
        this.setOpaque(true);   
        this.setText(value.toString());   
                    try {

                        this.setIcon(clienteD.getImagen(cli.getid_Cliente()));
                    } catch (SQLException ex) {
                        Logger.getLogger(ConsultarCliente.class.getName()).log(Level.SEVERE, null, ex);
                    }
    
        return this;   
    }   
}); 
  
dataFormatada = formata.format(cli.getData_Cliente()); 

        modelo.addRow(new String[] {
                       
            cli.getid_Cliente().toString(), 
            cli.getNome_Cliente(), 
            cli.getEstado_Cliente(), 
            cli.getCpf_Cliente(),
            dataFormatada,
           // cli.getData_Cliente().toString(), 
            "", 
    
        });
       
        
    }
} 

ai ele so coloca na coluna Foto o icone do primeiro registro quando eu faço uma pesquiza por um unico nome ai sim da certo mas quando tem varios no jtable ele sempre pega o icone do primeiro para todos os outros sabes aonde q ta o BUG ???
cada vez q passa no for eu seto o icone novo teria que funcionar