Como fazer referência ao caminho da imagem em um arquivo .JAR? [RESOLVIDO]

Pessoal, eu já dei uma olhada aqui no Forum, e não encontrei nada parecido para me orientar, pois bem…

Estou querendo mostrar uma imagem .GIF (animada) dentro de um botão Swing (o famoso carregando), até aí, tudo bem, e tudo funciona (eu uso as propriedades HTML como no código abaixo)

String caminho = "<html><img src='file:///D|/JAVA/Programa/src/carregando.gif' border=0></html>"; botaoBuscar.setText(caminho);

(Para os curiosos, ou para o pessoal que deseja implementar algo parecido, eu criei o meu gif aqui: http://www.ajaxload.info/)

Pois bem, desde já, eu já sabia que este código não iria funcionar em outra máquina, pois a mesma não possui o arquivo GIF nesta pasta, mas tratei de colocar o mesmo arquivo no diretório SRC (uso o Netbeans) para que seja distribuída juntamente com o JAR criado - Isso também deu certo, o arquivo é anexado juntamente com o Jar, ficando na raiz do projeto empacotado.

Agora, como eu consigo recuperar este arquivo do meu programa?

Procurando na internet, vi algumas implementações como:

String caminho = "<html><img src='file:///"+Class.class.getResource("/").toString().replaceFirst("file:/", " ").replaceAll("%20", " ").replace(":", "|").trim()+"carregando.gif' border=0></html>";

Esta alternativa também não funciona em outra máquinas…

O pessoal poderia me dar uma luz nessa questão?
Abraços,
Edson

você consegue exibir a imagem obtendo a referencia a ela pelo seu class.getResourceAsStream por exemplo ou pelo getResource como você estava fazendo, porém não é necessário usar o código html para isso.

ja que você está no netbeans, para confirmar cria um projetinho com o matisse de teste, coloca o botão la e insere uma imagem de dentro do projeto e depois olha o código que ele gerou para o botão… é ± isso dai só que sem o código html…

Bem, o fato de eu usar o HTML para isso, é para facilitar a amostragem do Gif animado dentro de um botão… (ou qualquer outro arquivo visual, mas só para facilitar mesmo, pois vc tem os recursos de criação visual do HTML)

No mais, eu testei aqui essa outra alternativa:

String caminho = "<html><img src='file:///"+System.getProperty("user.dir")+"/carregando.gif' border=0></html>";

Mas ele ainda não recupera de dentro do arquivo JAR, mas da pasta onde ele é executado, ou seja, mesmo eu tendo o arquivo dentro do JAR, eu tenho que colocar eles na parte externa do sistema, o que não é uma saída muito inteligente…

Alguma solução mais cômoda?

Uau, que estranho, até o código

botaoBuscar.setIcon(new ImageIcon("carregando.gif"));

Me parece que não está funcionando… (No netbeans funciona legal, mas quando abro clicando 2X diretamente no JAR, não busca a imagem…)
Por via das dúvidas, coloquei o meu GIF em tudo quanto é local, mas mesmo assim não funcionou…

então cara… fazem uns bons emses que eu não mecho… nem com o netbeans e nem com swing… então nem repare em layout null e essas coisas…

fiz essa classezinha como um JFrame, colei a imagem na pasta onde ficam os códigos fontes aqui no eclipse… e executei, aqui exibiu certinho…

da uma olhada ai:

package swing;

import java.awt.*;
import javax.swing.*;

public class ImagemNoBotao extends JFrame{

	public ImagemNoBotao(){
		super("botão com imagem");
		innit();
	}
	
	public void innit(){
		
		JButton botao = new JButton("texto");
		ImageIcon img = new ImageIcon(getClass().getResource("/imagem.jpg"));
		botao.setIcon(img);
		botao.setBounds(10, 10, 200, 200);
		
		Container c = getContentPane();
		c.setLayout(null);
		c.add(botao);
		
		setSize(500, 500);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String args[]){
		new ImagemNoBotao();
	}
}

gerei o jar e funciono fora do eclipse… se precisar me manda mp com seu email que eu inclusive te mando o jar…

um detalhe que eu percebi testando aqui, é que se você colocar o arquivo como “imagem.jpg” na string, ele procura pelo arquivo a partir do pacote onde está a classe, mas se você colocar “/imagem.jpg” como acima, ele procura a partir da raiz do arquivo jar…

a forma correta de se chamar arquivos dentro do JAR é usando o getResource só que você fez de forma errada , aquele esquema de file:/// é inapropriado.
Pois você deve usar um caminho relativo de preferencia.

Supondo uma estrutura de pastas abaixo:

resources
|
imagem
|
ajax.gif

botaoAcao.setIcon(new javax.swing.ImageIcon(AlgumaClasseMinha.class.getResource("/resources/images/ajax.gif")))

ou

botaoAcao.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/images/ajax.gif")))

Opa, valeu pessoal, vou usar o modelo listado, e ver se consigo adaptar ao meu projeto! Realmente funcionou este esquema, e agora mesmo já coloquei em outra máquina, e tudo fluiu normalmente com a imagem, valeu pela ajuda e orientação!

Aqui vai o código de exemplo já implementado em um Jar. (e funcionando como o esperado, conforme as suas orientações!)

Uau, mal postei a resposta, e já possui 4 downloads! Espero que esta implementação ajude muita gente! :smiley:

uhauhauah que mundo pequeno em Edson… estou pesquisando umas paradas em java e derepente eu vejo meu colega de universidade postando duvidas aqui no fofum. eu sou o Patrick da ufla man do curso de engenharia de software ^^ um abrço man agora pra mim so falta a monografia… em breve me formo ^^

Fala Patrick que bom te re-encontrar por aqui! Isso mostra que o GUJ é mais que só “tirar dúvidas” e “resolver questões”, mas sim um local de encontrar amigos!
Boa sorte na monografia, e se necessitar de algo, é só falar!

Um grande abraço meu grande!