Dúvida sobre ImageIcon

Muito boa tarde a todos, sou iniciante em java e uso o Netbeans. Estava tentando entender um exemplo parecido com um que existe no Deitel, referente à exibição de uma imagem utilizando a classe JLabel, e comigo, não tem funcionado… Já tentei fazer as alterações que andei vendo por vários fóruns, mas continuo na mesma. Gostaria de saber, por favor, se alguém poderia me dizer por que razão este código (exatamente ele!) não funcionou. A imagem está no mesmo diretório que o .class. Agradeço de ante-mão qualquer ajuda!

package labeldemo; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; // public class LabelDemo { public static void main(String[] args) { ImageIcon labelIcon = new ImageIcon("brasil.jpeg"); JLabel centerLabel = new JLabel(labelIcon); JFrame apli = new JFrame(); apli.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); apli.add(centerLabel); apli.setSize(300, 300); apli.setVisible(true); } }

olá amigo quando vc manda executar ele da alguma excessão ?

Não, apenas a imagem não aparece.

Tente incluir a linha:

apli.setLayout(null);

Embora não recomendada, pode ser esse seu problema no momento. Já vai servir para vc testar.
Também cerfique-se que a imagem esteja na pasta onde o seu arquivo java está sendo executado, e que nome esteja certo (é .jpeg mesmo e não .jpg?)

Se estiver em linux, certifique que o arquivo brasil.jpeg tem permissão de leitura. Você pode dar um chmod 777 nele só para garantir.

Vinicius, creio que o problema dele seja o seguinte: digamos que ele tenha executado o programa dele como

java -cp . labeldemo.LabelDemo

e tanto o arquivo LabelDemo.class quanto o arquivo brasil.jpeg estejam no subdiretório labeldemo.

O problema é que ImageIcon com 1 parâmetro quer o nome de um arquivo (não de um resource), e ele é relativo ao diretório corrente.

Provavelmente o problema dele se resolveria momentaneamente usando:

        ImageIcon labelIcon = new ImageIcon("labeldemo/brasil.jpeg");    

Mas ainda não é uma boa solução, porque o correto é carregar de um resource (ou seja, relativo ao classpath), não de um arquivo.

De qualquer forma, cjbl, criar um JFrame diretamente, em vez de criar uma classe derivada de JFrame e fazer a inicialização dentro dessa subclasse de JFrame, é algo que não é recomendado (veja que a ordem de inicialização das coisas ficou muito misturada quando você usa um JFrame “puro”).

Tem razão, nem prestei atenção do “package” ali em cima. Geralmente quem inicia faz tudo no pacote default.

Sempre recomendo, para quem está começando a aprender Swing, a usar um plugin como o WindowBuilder do Eclipse, acertar algumas opções (as opções default do WindowBuilder também geram código desorganizado), e então aprender pelo método “leia o código que ele gerou e tente entendê-lo” em vez de “crie tudo na mão e repita o que o mestre mandou”.

O NetBeans gera código excessivamente complexo (por causa do Matisse / javax.swing.GroupLayout) e não recomendo usar o NetBeans para aprender Swing.

Caros amigos, agradeço muito pelas dicas!

Viny:

Eu inclui a linha <apli.setLayout(null)>, mas também não funcionou. :frowning: Mas valeu pela idéia!

A extensão do arquivo-imagem que eu coloquei estava mesmo errada, ele é .jpg, mas mesmo depois de corrigido o erro, também não funcionou.

Entanglement:

Também inclui <ImageIcon labelIcon = new ImageIcon(“labeldemo/brasil.jpeg”)>, mas infelizmente não funcionou. :frowning: Também valeu pela idéia!

Eu tentei criar um pacote chamado , coloquei a imagem lá e pus a linha < ImageIcon labelIcon = new ImageIcon(“images/brasil.jpg”)>, mas ainda não funcionou.

Realmente, o código gerado pelo Netbeans é muito complexo. Vou ver se pelo Eclipse fica mais fácil entender.

Ainda com relação ao código que postei, se alguém tiver mais alguma dica…

Eu tenho insistido em fazer na mão porque eu gostaria de aprender os conceitos básicos.