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?
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
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.
// 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)
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:
publicclassConfigUtils{publicstaticInputStreamgetResourceAsStream(Stringresource){Stringstripped=resource.startsWith("/")?resource.substring(1):resource;InputStreamstream=null;ClassLoaderclassLoader=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){thrownewRuntimeException(resource+" not found");}returnstream;}publicstaticbyte[]getResourceAsByteArray(Stringresource){try{InputStreamin=getResourceAsStream(resource);byte[]bytearray=newbyte[in.available()];in.read(bytearray);returnbytearray;}catch(IOExceptione){e.printStackTrace();returnnull;}}}
ksi
Guerra obrigado pela resposta!
O código da forma como você citou funcionou perfeitamente no IDE, modifiquei a linha anterior para: