Ler uma imagem de dentro do jar [Resolvido]

Olá galera blz? Peço a ajuda de vocês: não consigo ler uma imagem de dentro de um jar. Rodando pela IDE Funciona blz, mas no jar executavel não.

Já li vários posts sobre esse caso mas ainda não consegui resolver… desse posts, vejo que tenho que usar o tal método getResourceAsStream mas não sei utilizar, já que ele retorna um InputStream que eu não faço idéia do que fazer com ele.

O código que funciona na IDE é esse:

ImageIcon icon = new ImageIcon( getClass().getResource("/imagem/forca00.jpg" )); 
lblImagem.setIcon(icon);       

Sendo que imagem é um pacote que criei.

Será que alguem poderia me ajudar?

Ai vai um exemplo de código…
setIconImage(new ImageIcon(getClass().getResource("/imagen/forca00.jpg")).getImage());
verifique também se o caminho está sendo passado corretamente,
pois as vezes passa despercebido as letras maiúsculas…
espero que ajude…

Cara, desculpe, mas esqueci de falar que estou inserindo a imgem num JLabel e ele não suporta o setIconImage… tentei usar aqui mas não funcionou.

só lembrando que a pasta onde estão contidas as imgens da sua aplicação , deve ser um pacote para que consiga está lendo essas imagens direto do jar.

Então gente, como falei ali em cima, ate funciona se eu rodar a aplicacao pela IDE, o problema é executando o jar.
Abri o .jar para vocês darem uma olhada nos pacotes:

Como deveria acessar?

Cara,
Essa pasta com a imagem está dentro do seu jar correto?
Tenta executar seu .jar pelo prompt para ver qual o erro está sendo gerado.
Mas cara, vc tem que observar bem que pela IDE ele enxerga a pasta onde o netbeans está configurada para visualizar os projetos, isso é automático.
Mas quando passa para o jar vc tem que especificar o path da imagem por completo, pois ele não sabe o “caminho” onde o netbeans salva o seu projeto por exemplo.
Por exemplo, eu acesso várias informações dentro de um jar no sistema que tenho aqui, mas preciso sempre passar a url completa como

String caminhoJar = System.getProperty("user.home")+System.getProperty("file.separator")+"Documents"+System.getProperty("file.separator")+nomePasta+System.getProperty("file.separator")+"dist"+System.getProperty("file.separator")+nomeDoJar+".jar";
Depois eu faço o acesso pelo zipEntry

[code]
public void creating(){
try {
ZipFile zipFile = new ZipFile(caminhoJar);

    Enumeration<? extends ZipEntry> entries = zipFile.entries();  
  
    while (entries.hasMoreElements()) {  
        ZipEntry zipEntry = (ZipEntry) entries.nextElement();  
        String name = zipEntry.getName();  
        if (!zipEntry.isDirectory() && name.contains("NOME_DA_PASTA_QUE_EU_PROCURO")){  
            System.out.println(name);
            try{
                checkExists();
            }
            catch(Exception e){
                JOptionPane.showMessageDialog(null,"Erro ao carregar arquivos do sistema!"+e,"ERRO",JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        }  
    }  
} catch (IOException e1) {  
    e1.printStackTrace();  
}  
}[/code]

Espero ter ajudado.
PS: Depois poste aqui o erro que o prompt vai te gerar.(Eu acho que ele não está achando a imagem mesmo)
Abraços

Realmente, o aplicativo não estava encontrando o arquivo , tava dando NullPointerException!

andre_bento, te agradeço pelo código que tu postou, porque funfou aqui finalmente! (Aweeeeeeeeeee!!!)

Para deixar registrado, segue a parte do código:

Achei uma solução mais flexivel para achar o jar na máquina do usuário.

String caminhoJar = System.getProperty("java.class.path");  

Aqui o código modificado:

        try {
            ZipFile zipFile = new ZipFile(caminhoJar);
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry zipEntry = (ZipEntry) entries.nextElement();
                String name = zipEntry.getName();
                
                //JOptionPane.showMessageDialog(null,name);
                if (!zipEntry.isDirectory() && name.contains("Imagem/forca00")){ //Aqui pergunta se achou esse arquivo  
                    InputStream is = ClassLoader.getSystemResourceAsStream(name);   
                    lblImagem.setIcon(new ImageIcon(ImageIO.read(is)));  //Insere o arquivo na JLabel
                }
            }
        } 

Agradeço à todos pela ajuda! :wink:

Olá amigo.
Cara que bom!!!
Fico feliz que o código funcionou e te atendeu legal ae, tenho isso e várias outras coisas legais qe tenho em um grande sistema.
Qualquer coisa é só falar que estaremos pronto para te ajudar.
Abraços[]

Ahhh, só pra constar cara, eu uso o código

    String caminhoJar = System.getProperty("user.home")+System.getProperty("file.separator")+"Documents"+System.getProperty("file.separator")+nomePasta+System.getProperty("file.separator")+"dist"+System.getProperty("file.separator")+nomeDoJar+".jar";  

Porque meu jar estava dentro de uma pasta nos documentos do usuário…
Mas ótima colocação a sua amigo!

Sussa! :wink:

Fiz exatamente como postaram e mesmo assim a imagem não carrega no meu projeto .jar, na IDE mostra normal, já no jar ainda não consegui, rodei pelo prompt de comando e também não retorna erro algum, o programa esta executando normalmente, somente a imagem não carrega.

segue o trecho onde setei a imagem no jLabel, no projeto criei o pacote imagens e arrastei a imagem para dentro.

Alguem poderia analisar o código e ver onde está o erro?

[code]String caminhoJar = System.getProperty(“java.class.path”);

                    try {
                        ZipFile zipFile = new ZipFile(caminhoJar);
                        Enumeration<? extends ZipEntry> entries = zipFile.entries();
                        while (entries.hasMoreElements()) {
                            ZipEntry zipEntry = (ZipEntry) entries.nextElement();
                            String name = zipEntry.getName();

                            //JOptionPane.showMessageDialog(null,name);  
                            if (!zipEntry.isDirectory() && name.contains("imagens/quadrodescricao.JPG")) { //Aqui pergunta se achou esse arquivo    
                                InputStream is = ClassLoader.getSystemResourceAsStream(name);
                                Figura_Quadro_Descricao.setIcon(new ImageIcon(ImageIO.read(is)));  //Insere o arquivo na JLabel  
                            }
                        }
                    }catch(Exception e){
                        JOptionPane.showMessageDialog(this, "Erro ao Carregar a Imagem \n" + e);
                    }
    
    Figura_Quadro_Descricao.setLabelFor(Figura_Quadro_Descricao);[/code]

Nuss manolo, desinterrou um defunto… rsrsr…

Olha cara, olhando o seu código, acredito que não está funcionando porque tu colocou o caminho do arquivo + arquivo + extensão.

Tenta fazer assim:

if (!zipEntry.isDirectory() && name.contains("imagens/quadrodescricao")) { //Aqui pergunta se achou esse arquivo

Espero ter ajudado!

[quote=Cornelius]Nuss manolo, desinterrou um defunto… rsrsr…

Olha cara, olhando o seu código, acredito que não está funcionando porque tu colocou o caminho do arquivo + arquivo + extensão.

Tenta fazer assim:

if (!zipEntry.isDirectory() && name.contains("imagens/quadrodescricao")) { //Aqui pergunta se achou esse arquivo

Espero ter ajudado![/quote]

Nuss, muito obrigado pela ajuda, era isso mesmo!!
1º aplicação sozinho é soda… a cabeça fica explodindo e detalhes passam.

Valeu Cornelius, pela resposta correta e pela rapidez com a qual respondeu.

OK man! Tamu ai! :lol: