[RESOLVIDO] - Dúvida sobre utilização de pacotes

4 respostas
pvrsouza

Galera,

Eu tenho em meu projeto dois pacotes: GUI e imagens. Dentro de GUI, tenho alguns JFrames e neles eu chamo as imagens assim:

protected void paintComponent(Graphics g) { super.paintComponent(g); Image img = (new ImageIcon(getClass().getResource("/imagens/teste.gif"))) .getImage(); g.drawImage(img, 0, 0, this); }

Só que a imagem não está aparecendo. Eu acho que o problema está no caminho do meu pacote. Eu pensei em do pacote atual(pacote GUI) e entrar no pacote que eu quero acessar a imagem(pacote imagens). Mas como eu faria isso? Em outras linguagens eu usaria os tres pontos(mais ou menos como o DOS) assim…

protected void paintComponent(Graphics g) { super.paintComponent(g); Image img = (new ImageIcon(getClass().getResource(".../imagens/teste.gif"))) .getImage(); g.drawImage(img, 0, 0, this); }
…mas, como podem imaginar, não funcionou! Rsrsrsrs.

4 Respostas

ViniGodoy

Engraçado era para o primeiro funcionar. No getResource() o caminho é sempre relativo a raiz do seu classpath, não ao diretório que a classe está.
Você tem certeza que imagens é um pacote? E ele está na raiz do seu projeto?

Uma dica (que acho que já dei em outro tópico seu). Nunca carregue recursos dentro do seu paintComponent. Deixe essa tarefa para o construtor. O paintComponent é chamado sempre que sua janela precisar ser recarregada, por isso, lá só deve ter o código de pintura, não o de criação da imagem. Deixar a criação no paintComponent força a carregar a imagem do disco várias vezes, e essa é uma operação extremamente lenta.

Além disso, carregar imagens pelo ImageIcon é desaconselhado há mais de 5 anos. Hoje em dia, prefira a carga com a classe ImageIO:

Qual é o tamanho dessa imagem? Outro problema é que, a menos que você tenha configurado o Graphics para considerar os insets - como ensina meu site, é que sua imagem pode estar sendo desenhada atrás da barra de título e da borda de sua janela. Se a imagem for pequena, você não a veria, mesmo que o caminho esteja certo. O sistema não está disparando nenhuma nullPointerException?

pvrsouza

ViniGodoy:
Engraçado era para o primeiro funcionar. No getResource() o caminho é sempre relativo a raiz do seu classpath, não ao diretório que a classe está.
Você tem certeza que imagens é um pacote? E ele está na raiz do seu projeto?

Pois é. O interessante é que na maquina do colega que está desenvolvendo comigo funciona perfeitamente. Como utilizamos o kenai(até quando ele funcionar…rsrsrsrs) não corro o risco de estar com cógido-fonte desatualizado.

[quote=ViniGodoy]Uma dica (que acho que já dei em outro tópico seu). Nunca carregue recursos dentro do seu paintComponent. Deixe essa tarefa para o construtor. O paintComponent é chamado sempre que sua janela precisar ser recarregada, por isso, lá só deve ter o código de pintura, não o de criação da imagem. Deixar a criação no paintComponent força a carregar a imagem do disco várias vezes, e essa é uma operação extremamente lenta.

Além disso, carregar imagens pelo ImageIcon é desaconselhado há mais de 5 anos. Hoje em dia, prefira a carga com a classe ImageIO:

Vou comecar a estudar ImageIO e estudar os tratamentos de exceção dele. Realmente vc já tinha falado isso para mim, mas como sou novato ainda, acabei me deixando levar pelo mais facil(que foi o que foi passado pelo professor).

Nenhuma imagem que estou usando ultrapassa 25kb.

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

at javax.swing.ImageIcon.<init>(ImageIcon.java:167)

at Gui.MesaGui.paintComponent(MesaGui.java:23)

at javax.swing.JComponent.paint(JComponent.java:1017)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paint(JComponent.java:1026)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paint(JComponent.java:1026)

at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paintToOffscreen(JComponent.java:5119)

at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)

at javax.swing.RepaintManager.paint(RepaintManager.java:1220)

at javax.swing.JComponent.paint(JComponent.java:1003)

at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)

at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)

at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)

at java.awt.Container.paint(Container.java:1780)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)

at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

at javax.swing.ImageIcon.<init>(ImageIcon.java:167)

at Gui.MesaGui.paintComponent(MesaGui.java:23)

at javax.swing.JComponent.paint(JComponent.java:1017)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paint(JComponent.java:1026)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paint(JComponent.java:1026)

at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)

at javax.swing.JComponent.paintChildren(JComponent.java:852)

at javax.swing.JComponent.paintToOffscreen(JComponent.java:5119)

at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)

at javax.swing.RepaintManager.paint(RepaintManager.java:1220)

at javax.swing.JComponent.paint(JComponent.java:1003)

at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)

at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)

at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)

at java.awt.Container.paint(Container.java:1780)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)

at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
ViniGodoy

O nullpointerexception realmente indica que ele não achou a imagem. A imagem está mesmo num pacote? Algumas IDEs diferenciam uma pasta de um pacote. Para que o getResource funcione, precisa ser um pacote do seu classpath, não uma pasta qualquer. O getResource não está preocupado com o sistema de arquivos e sim com a estrutura da sua aplicação.

Quando tive esse problema na Siemens, era justamente por isso. Na minha IDE (que funcionava) a pasta de recursos era encarada como um pacote, na do meu colega (que não funcionava) a pasta só constava como uma pasta normal do sistema.

Quando perguntei do tamanho, estava perguntando das dimensões (altura e largura) da imagem.

O ImageIO é bem simples. Na verdade, é até mais simples de usar do que através do ImageIcon. Praticamente basta chamar o método de read e pronto. E lógico, tratar as exceptions de “arquivo não encontrado” e afins, como toda classe de IO faz.

pvrsouza

Vini,

Consegui resolver. Vc estava certo. Era uma pasta que estava dentro do sistema e não um pacote.

Quando ao uso do ImageIO eu já vou alterar isso assim que eu estudar sobre exceções!

Brigadão!!

Criado 24 de março de 2010
Ultima resposta 24 de mar. de 2010
Respostas 4
Participantes 2