Problema ao carregar imagem a partir do jar

ViniGodoy,

quanto usar o “getResource()” tudo bem, quando coloquei ele para carregar o tabuleiro funcionou, mas prq as demais imagens (que eu nao estava usando o getResource()) não estão dando o mesmo erro?

outra dúvida, agora que esta funcionando o JAR (estou clicando 2x e ele abre em qualquer pasta do meu windows) eu passei ele pra outro computador e quando clico 2x la da uma msg de erro dizendo que não achou o main class. Mas como nao se em 1 pc ele acha deveria achar no outro tbm, q desgraça na minha vida!

Obrigado Vinicius

Desculpem-me se eu ofender mas, as pessoas dizem que o java é portavel e tudo mais, mas até hoje só tive dor de cabeça não consigo executar o mesmo programa nem em outro PC de mesma plataforma :confused:

Obrigado!

Qual é a versão do Java no outro computador? É a mesma?

O Java é sim, super portável. Aqui rodamos em diversas máquinas, incluindo algumas Linux. Não culpe o Java por sua falta de conhecimento.

Mas você realmente precisa tomar alguns cuidados, para que a portabilidade ocorra sem traumas. Fique tranquilo, são regras mais simples e mais intuitivas do que as de alocação de memória do C. Em pouco tempo, você vencerá essa curva de aprendizado e terá menos estresse.

Vini, em relação a imagem, eu estava com o mesmo problema… vou tentar contextualizar um pouco: Utilizei o NetBeans 6.7 para desenvolver um projetinho, matar a curiosidade em java. Sei que o classpath é um path relativo o qual matenho toda minha referência de projeto. Sei também que tudo na pasta lib pode estar dentro deste classpath. Levando isso em consideração: coloquei minha pasta /Imagem dentro de um jar, pois ao tentar colocar a pasta /Imagem na lib do meu projeto dentro do net beans durante a construção, a pasta lib desaparecia, não era construida e mesmo que com a sua criação manualmente com todas as dependências a referência não era mantida, mudei até mesmo o manifest.mf para tentar a referência, porém não foi mantida.
Felizmente resolvi o problema com getClass().getResource("/Imagem/imagem.JPG"), porém - mesmo não sendo uma imagem, mas acredito estar dentro do mesmo contexto - o mesmo raciocínio não funcionou para um arquivo help.exe que tentei executar com Runtime.getRuntime().exec("/Help/Help tcc_Help.exe").

nota: Colocar somente o caminho de referência relativo do classpath até os meus arquivos .exe e .JPG não funciona. A imagem consegui carregá-la utilizando o getResource(), porém o .exe nem mesmo assim…

Valeu, espero respostas…

É problema de path sim. A questão é que o path do eclipse baseia-se no sistema de arquivos, e o do .jar no jar. Um é case sensitive, outro não. Um está com a raiz na raiz do seu classpath, outro pode estar em qualquer pasta de execução do eclipse configurada em seu projeto.

Como você mesmo comprovou, rodar no eclipse não é garantia de nada.[/quote]
Boa tarde, Vini. Estou com o mesmo problema!

[code]
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;

public class Volante{

private BufferedImage bufferedImage = null;

public Volante(){
	try {
        URL imgUrl = this.getClass().getResource("/image/volante.png");
        if (imgUrl == null) {
            System.out.println("Imagem não encontrada!");
        } else {
            bufferedImage = ImageIO.read(imgUrl);
        }
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }
}

public BufferedImage getBufferedImage(){
	return bufferedImage;
}

}[/code]

Você algum erro nesse código? Essa é uma classe para carregar a imagem.

Nenhum problema. Como está a estrutura de pacotes do seu projeto? E dá algum erro?

A estrutura é a seguinte:
src (Source Folder)
res (Source Folder), contendo um package com as imagens.

Não ocorre nenhum erro. Inclusive ele retorna um endereço de onde o .jar se encontra tudo correto, porém não exibe as imagens no frame.
As classes Volante e Cangaceiro, estão em res. Elas carregam as imagens.

Coloquei para imprimir o endereço que é gerado através do getClass().getResource() e o endereço é jar:file:/C:/Users/Michel/Desktop/application.jar!/image/volante.png que ao que me parece está correto e mesmo assim não exibi no frame.

Posta o código de como vc está fazendo para mostrar isso no frame.

imgPersonC, imgPersonV e imgSeta são do tipo BufferedImage.

[code]public void loadImg() {
imgPersonC = new Cangaceiro().getBufferedImage();
imgPersonV = new Volante().getBufferedImage();
imgSeta = new Seta().getBufferedImage();
}

public void onRender(Graphics2D graphics2d) {
graphics2d.drawImage(imgPersonC, personC.x, personC.y, null);
graphics2d.drawImage(imgPersonV, personV.x, personV.y, null);

	graphics2d.translate((imgSeta.getWidth()) + seta.x, (imgSeta.getHeight()) + seta.y);
	graphics2d.rotate(angle * (Math.PI/180));
	graphics2d.translate(-((imgSeta.getWidth()) + seta.x), -((imgSeta.getHeight()) + seta.y));
	graphics2d.drawImage(imgSeta, seta.x, seta.y, null);
	
	graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
	
	
}

public void render() {
Graphics2D graphics2d = (Graphics2D) bufferStrategy.getDrawGraphics();
graphics2d.setColor(Color.WHITE);
graphics2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());
onRender(graphics2d);
graphics2d.dispose();
bufferStrategy.show();
}

public void onRender(Graphics2D graphics2d) {
graphics2d.drawImage(imgPersonC, personC.x, personC.y, null);
graphics2d.drawImage(imgPersonV, personV.x, personV.y, null);

	graphics2d.translate((imgSeta.getWidth()) + seta.x, (imgSeta.getHeight()) + seta.y);
	graphics2d.rotate(angle * (Math.PI/180));
	graphics2d.translate(-((imgSeta.getWidth()) + seta.x), -((imgSeta.getHeight()) + seta.y));
	graphics2d.drawImage(imgSeta, seta.x, seta.y, null);
	
	graphics2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
	
	
}

[/code]

Dica: No rotate, use Math.toRadians no lugar de multiplicar por PI/180, fica mais claro.

Quem chama os métodos onRender e render?

render chama onRender!

public void executeApp(){
active = true;

	load();
	
	while(active){
		update();
		render();
	}
	
	unload();
}

E quem chama o render? Tem uma thread para isso?

Tem sim!

Onde você chamou o loadImg? Pode postar o código dessa thread.

Posso mandar o código completo! Fica mais fácil para identificar o erro! Eu particularmente tento desde ontem e não consigo!

Assim que baixar me sinaliza, por favor! Para testar é só executar a classe server primeiro e depois a classe application

Muitos problemas no código?

Enfim, consegui!

E qual foi a solução? O que você estava fazendo de errado?