Java Swing:Visualização de imagens a partir de dentro de um Frasco
-
09-06-2019 - |
Pergunta
Ao executar um aplicativo Java a partir do eclipse do meu ImageIcon mostra-se muito bem.
Mas depois de criar um jar o caminho para a imagem, obviamente, fica asneira.
Existe uma maneira de extrair uma imagem do frasco, em tempo de execução para que eu possa abri-lo?Ou, será que há uma maneira melhor de fazer isso?
Eu gostaria de distribuir um único arquivo jar, se possível.
Solução
Para criar um ImageIcon
a partir de um arquivo de imagem dentro de uma mesma frascos seu código é carregado:
new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))
Class.getResource
retorna uma URL de um recurso (ou null
!). ImageIcon
tem um construtores que carregar a partir de um URL.
Para criar um URL para um recurso em um frasco não no "classpath", consulte a documentação para java.net.JarURLConnection
.
Outras dicas
Você pode tentar algo como:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");
Em seu arquivo JAR, você pode ter uma estrutura de diretório:
MyJAR.jar
- com (arquivos de classe em aqui)
- imagens
----image.jpg
Esse é um trabalho para mim, para carregar e configurar o conteúdo do painel de imagem de plano de fundo:
jar (ou build path) contém:
- com
- img
---- bg.png
java contém:
JFrame f = new JFrame("Testing load resource from jar");
try {
BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png"));
f.setContentPane(new ImagePanel(bg));
} catch (IOException e) {
e.printStackTrace();
}
Testado e a funcionar em ambos os jar e unjarred (que é o termo técnico) de execução.
BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png")
- o que eu tentei primeiro me devolveu um valor nulo InputStream.
No netbeans 8.1 o que eu tenho feito é incluir a pasta de ícones e outras imagens chamado Recursos dentro do src pasta em que o arquivo de projeto.Assim, sempre que eu construir Jar arquivo a pasta está incluída existe.A árvore do arquivo deve ser semelhante a este:
- src (arquivos Java na origem packges está aqui)
** PACOTE CHAMADO NO PROJETO**
- file.java
Recursos
- image.jpg
O código deve ser assim:
jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));
Carregar imagem do arquivo Jar durante o tempo de execução é o mesmo que o carregamento de imagem quando executado a partir de IDE e.g netbeans a diferença é que ao carregar a imagem a partir de ficheiro JAR o caminho tem de ser correta e a sua sensível a maiúsculas e minúsculas (muito importante).Isso funciona para mim
image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg")); img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH); lblhabitat1.setIcon(new ImageIcon(img));
se p "/Pictures/firstgame/habitat1.jpg" é minúscula, isso não vai funcionar.verifique espaços, processos e ortografia