Inserir imagem em um JButton, DÚVIDA!

Fala galera blz?!

Estava eu tentando inserir uma imagem em um Jbutton, funcionou tudo legal, entretando, só funciona se eu por o caminho completo para a imagem, por mais que ela esteja no local da aplicação.

Gostaria de saber, o que devo fazer, para não depender do caminho completo, apenas pondo o nome da imagem!

Funciona assim:

Icon inserir = new ImageIcon("/root/Desktop/SISTEMA CPADI/TELAS/Cadastros/mais.gif"); B_ins=new JButton("Inserir",inserir);

Assim, não:

Icon inserir = new ImageIcon("mais.gif"); //considere que o mais.gif está no diretório da classe em questão B_ins=new JButton("Inserir",inserir);

Opá…ser
Guarde-o em uma constante:

String caminho = "/root/Desktop/SISTEMA CPADI/TELAS/Cadastros/mais.gif";

use caminho qd for referencia-la.

Att,

a) ImageIcon tem um construtor que aceita um objeto do tipo java.net.URL
b) Um objeto URL, representando um arquivo que está no seu CLASSPATH, pode ser obtido como:
getClass().getClassLoader().getResource (“mais.gif”)
ou
getClass().getResource(“mais.gif”)
(Usar “getClass().getClassLoader()” ou “getClass()” simplesmente depende do tipo de sua aplicação. Se for uma aplicação Swing, getClass() é suficiente. Se for uma aplicação Web, getClass().getClassLoader() é o que normalmente funciona.)

(atenção - é melhor pôr suas imagens em um diretório da aplicação separado, como “/resources/images”, em vez de misturá-las com os arquivos .java. Ex:

getClass().getClassLoader().getResource ("/resources/images/mais.gif")

Fala Marck, blz? Acho que seu exemplo não iria mudar mto coisa, uma vez que eu poderia distribuir a app. daria um pouco de trabalho, ficar mudando toda hora, não acha? mas mto obrigado pela atenção.

thingol, sua dica parece interessante, mas, desculpe minha ignorancia, como eu poderia usar este metodo? Qual o tipo de variavel iria instanciar o que tu me passou? Muito obrigado. Abraços

ow, foi mals :oops:
nao interpretei a pergunta…

[quote=peerless]Fala Marck, blz? Acho que seu exemplo não iria mudar mto coisa, uma vez que eu poderia distribuir a app. daria um pouco de trabalho, ficar mudando toda hora, não acha? mas mto obrigado pela atenção.

thingol, sua dica parece interessante, mas, desculpe minha ignorancia, como eu poderia usar este metodo? Qual o tipo de variavel iria instanciar o que tu me passou? Muito obrigado. Abraços[/quote]

Tá bom, vamos lá (acho que não fui claro):

Icon inserir = new ImageIcon(getClass().getClassLoader().getResource (“mais.gif”)); // aplicação Web

Icon inserir = new ImageIcon(getClass().getResource (“mais.gif”)); // aplicação Swing

Opa, então você foi claro o suficiente para mim fazer isso, e me deparar com o seguinte erro:

Exception in thread "main" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:138) at TCadastro.<init>(TCadastro.java:147) at TCadastro.main(TCadastro.java:414) Java Result: 1

:frowning:

Se ele não achar no lugar correto, getResource() retorna null. Você precisaria alterar sua referência para a imagem (é por isso que eu costumo usar “/resources/images/blablabla.gif” em vez de pô-la relativa à classe.)

E tome cuidado com um detalhe.

O getResource() pode ser case sensitive.

Por exemplo, se você tem a imagem imagem.jpg, fazer getClass().getResource("/Imagem.jpg") vai funcionar no Windows, mas não funcionará no Linux e nem num jar.

Então, via de regra, fique atento às letras maiúsculas e minúsculas quando informar o nome de seu arquivo.

Uma vez eu tive problemas com um trainee - ele editava a imagem no Paint da Microsoft, e esse programa tem a mania de deixar a extensão dos arquivos em maiúsculas.

Quando o programa rodava sob a IDE, os arquivos de imagem estavam no CLASSPATH (explodidos), e não havia problemas. Só que quando ele montava o JAR, o tal arquivo não era encontrado dentro do JAR, e a aplicação dava problemas.

Até ele entender isso foi um parto. O problema é que ele era pouco cuidadoso e nunca renomeava o arquivo depois de editá-lo com o Paint; aí o erro sempre e sempre se repetia.

Infelizmente, não funcionou, tentei diversos diretórios, inclusive o completo.

Bom, obrigado de qualquer forma. Se alguem tiver outra solução, agradeço

fiquem em paz… abraços

:roll: