Jar + Imagens

13 respostas
ksi

Pessoal,
Tenho uma aplicação que utiliza alguns ícones .png, usando o eclipse eu criei um arquivo JAR e nele também incluí os ícones, porém quando rodo a aplicação a partir do JAR ela não mostra os ícones, pelo contrário, apenas expõe um espaço nulo, sem os ícones.

Eu gostaria de perguntar à vocês o seguinte:
Quando eu faço uma aplicação que utiliza imagens que estão incluidas em um JAR eu preciso extraí-las para um diretório e então utilizá-las ou há outra forma de executar essa tarefa?

Abraços

13 Respostas

jopss

Bom, para fazer minhas distribuicoes, como q 99,99999999% dos programas sao windows, eu uso ISTool+InnoSetup para se fazer um instalador… lah vc pode colocar contratos de licenças, icones e menu no iniciar.

jopss :stuck_out_tongue:

ksi

Ah, lembrando que eu não quero modificar o ícone do arquivo JAR, apenas expor os ícones que estão no JAR em um Frame.

Jeferson_Flamini

Bom dia ksi, dê uma olhada em getResource()

JLabel r = new JLabel(); r.setIcon(new ImageIcon(getClass().getResource("/imgs/ok.png")));

Ratao

Coloque o Jar gerado na mesma pastado seu projeto e veja se funcione. Caso funcione assim como funcionou comigo. Crie um atalho e utilize o atalho para executar o programa.

abraço!

Jeferson_Flamini

Jeferson Flamini:
Bom dia ksi, dê uma olhada em getResource()

JLabel r = new JLabel(); r.setIcon(new ImageIcon(getClass().getResource("/imgs/ok.png")));

ops esqueci de mencionar, o método getResource é da classe java.lang.Class

ksi

Obrigado aos que responderam, mas tentei das duas formas, usando o getResource() e colocando o JAR na mesma pasta que meu projeto e as imagens continuam não aparecendo.
Até mais.

Jeferson_Flamini

ksi, as suas imagens estão dentro de qual diretório dentro do jar?

ksi

Está em um diretório chamado “icones”, a chamada na criação do ImageIcon é usada por uma classe que contém as Strings estáticas que indicam o caminho dos icones.

package constantes;

public class Icones {
	public static final String ECLIPSE = "/icones/eclipse.png";
	public static final String FIREFOX = "/icones/firefox.png";
	public static final String MSN = "/icones/msn.png"; 
	public static final String WINAMP = "/icones/winamp.png";
	public static final String AZUREUS = "/icones/azureus.png";
}

Mas acho que isso não altera em nada.

Petronio_Braga

ksi,

faz o seguinte:

// coloca uma figura na barra de título da janela URL eclipse = this.getClass().getResource(Icones.ECLIPSE); Image imagemTitulo = Toolkit.getDefaultToolkit().getImage(eclipse); this.setIconImage(imagemTitulo);

Outro exemplo:

// coloca uma figura na barra de título da janela URL eclipse = this.getClass().getResource(Icones.ECLIPSE); Image imagemTitulo = Toolkit.getDefaultToolkit().getImage(eclipse); JLabel lblFigura = new JLabel(); lblFigura.setIcon(new ImageIcon(imagemTitulo));

Espero ter ajudado.

ksi

Obrigado pela resposta.
Bom, dêem uma olhada na imagem para entender melhor.
Quando rodo a aplicação no Eclipse, os ícones aparecem, porém quando dou dois cliques no JAR os ícones não aparecem devidamente, como aparece na imagem à direita.

Cada grupo (Icone + checkbox) é um objeto de uma classe que estende JPanel e é adicionado a um JFrame, eis o código de cada grupo, como eu chamo “barra”.(Construtor)

//Lembrando que Barra extends JPanel
	public Barra(String caminho, String nome, String caminhoDoIcone, boolean selecionado) {
		setLayout(new GridLayout(1,3,0,0));
		checkBox = new JCheckBox();
		checkBox.setText(nome);
		checkBox.setSelected(selecionado);
		ico = new ImageIcon(caminhoDoIcone);
		labelIco = new JLabel(ico);
		this.caminho = caminho;
		add(labelIco);
		add(checkBox);
	}


Guerr

Para fazer isto no meu framework SwingBean eu “chupei” um código que o hibernate usa para carregar seus arquivos de configuração. Está sendo bastante útil para mim e acho que vai te ajudar também.

Com ele você pode colocar as figuras na raiz do seu jar e carregar passando o nome do arquivo. O legal é que funciona dentro e fora do jar, sendo que você não vai precisar mudar nada quando estiver testando dentro do seu IDE.

Aí vai o código:

public class ConfigUtils {
	
	public static InputStream getResourceAsStream(String resource) {
		String stripped = resource.startsWith("/") ? 
				resource.substring(1) : resource;
	
		InputStream stream = null; 
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		if (classLoader!=null) {
			stream = classLoader.getResourceAsStream( stripped );
		}
		if ( stream == null ) {
			ConfigUtils.class.getResourceAsStream( resource );
		}
		if ( stream == null ) {
			stream = ConfigUtils.class.getClassLoader().getResourceAsStream( stripped );
		}
		if ( stream == null ) {
			throw new RuntimeException( resource + " not found" );
		}
		return stream;
	}
	
	public static byte[] getResourceAsByteArray(String resource) {
		try {
			InputStream in = getResourceAsStream(resource);
			byte[] bytearray = new byte[in.available()];
			in.read(bytearray);
			return bytearray;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

}
ksi

Guerra obrigado pela resposta!
O código da forma como você citou funcionou perfeitamente no IDE, modifiquei a linha anterior para:

ico = new ImageIcon(ConfigUtils.getResourceAsByteArray(caminhoDoIcone));

Porém quando exporto o JAR e vou executá-lo a aplicação nem abre, fiz uso incorreto do método?

[]

Guerr

Eu coloco o arquivo na raiz do JAR e utilizo como caminho “imagem.jpg”, por exemplo. Coisas a considerar:

  • Verificar se a imagem realmente foi incluida dentro do Jar
  • Verificar se a imagem está dentro de um diretório com os .class ou na raiz do Jar
Criado 30 de janeiro de 2007
Ultima resposta 5 de fev. de 2007
Respostas 13
Participantes 6