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.
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!