Imagem estragando JPanel?

20 respostas
G

Olá eu tenho um JPanel e um JFrame que funcionam perfeitamente, porém quando tento adicionar o paintComponent para colcoar minha imagem a tela que foi definida por mim como preta, fica cinza(como se não tivesse background)... qual seria o problema?

Meu código:

@Override
    public void paintComponent(Graphics g) {

        Image player = Toolkit.getDefaultToolkit().getImage("player.png");
        g.drawImage(player, 35, 35, this);

    }

20 Respostas

M

paintComponent não é protected?

G

Nao faz nenhum diferença

ViniGodoy

Não carregue a imagem no paintComponent. Aliás, é uma boa dar uma lida nos artigos de Java 2D aqui do meu site…

Tem uma série de conceitos que é bom ser entendidos, antes de sair pintando por aí.

WendersonLP

Não o método paintComponent é public mesmo.

Tente carregar a imagem assim:

public void paintComponent(Graphics g) {
      Image player = new Image(getClass().getResource("player.png"));
      g.drawImage(player, 35, 35, this);
}
G

Vinicius, você poderia me dar um exemplo de carregar a imagem de um jeito eficaz?

outra pergunta, qual é seu site?

M

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)

É protected.

O que estranhei foi o Override não acusar nada. Achei que ele considerava visibilidade também.

G

WendersonLP tentei carregar a imagem do seu jeito mais o net beans diz assim:

"java.awt.Image is abstract, cannot be instantied".

para esse código:

@Override
    protected void paintComponent(Graphics g) {

        Image player = new Image(getClass().getResource("player.png"));
        g.drawImage(player, 200, 162, this);

    }

"/ alguém tem outra ideia?

ViniGodoy

O meu site é o da minha assinatura:
http://www.pontov.com.br

Veja o artigo trabalhando com imagens.

G

Estou desesperado vou postar meu código inteiro, Vinicius não consegui fazer a imagem funcionar usando Media Tracker, eu sei que você é especialista em jogos e gostaria que você me desse um exemplo à partir de meu código. Como eu posso adicionar uma imagem , que seria para um joguinho...

Meu código:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.swing.*;
import java.awt.*;
import java.awt.Toolkit.*;

/**
 *
 * @author Usuario
 */


class Panel extends JPanel {

    public Panel() {

        this.setPreferredSize(new Dimension(400, 325));
        this.setBackground(new Color(0, 0, 0));

    }
}


public class Jogo extends JFrame {

    public Jogo() {

        this.setTitle("Joguinho");
        this.setSize(400, 325);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        Panel p = new Panel();
        this.add(p);

    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jogo().setVisible(true);
            }
        });
    }
 }
ViniGodoy

Deixa a carga da imagem fora do paintComponent:

BufferedImage player = ImageIO.read(new File("player.png"));

@Override  

public void paintComponent(Graphics g) {  
   g.drawImage(player, 35, 35, this);  
}
M
ViniGodoy:
Deixa a carga da imagem fora do paintComponent:
BufferedImage player = ImageIO.read("player.png");

@Override  

public void paintComponent(Graphics g) {  
   g.drawImage(player, 35, 35, this);  
}

Aproveitando a deixa: em um jogo é melhor sobreescrever o método paint() ou o método paintComponent() para fazer a renderização? Qual a diferença na prática?

G

Aqui diz: cannot find symbol “read”.

BufferedImage player = ImageIO.read(“player.png”);

M

Troque por:

BufferedImage player = ImageIO.read(getClass().getResource("player.png"));
G

Marcos aqui diz:

“Unreported exception java.io.IOException; must be caught or declared to be trown”

Pra essa linha que você me enviou.

ViniGodoy

Se você fizer um filho de JComponent, você deve sobrescrevem paintComponent. Se fizer um filho de JFrame ou JApplet, você deve sobrescrever o método paint. Entretanto, a melhor forma mesmo é adotar uma técnica conhecida como escrita direta. Vou explicar sobre isso nos próximos artigos, mas consiste em basicamente obter o objeto BufferStrategy e, você mesmo, chamar os métodos para atualizar os buffers de pintura.

Isso porque o Swing não reaje a um repaint instantaneamente. E ele também pode ignorar repaints dados em intervalos de tempo muito próximos (event coalescing). Essas características são muito boas para UIs, mas péssimas para jogos.

ViniGodoy
GustavoSilva:
"Unreported exception java.io.IOException; must be caught or declared to be trown"

Faça assim:

public BufferedImage player = loadImage("player.png");

public static BufferedImage loadImage(String name) {
   try {      
      return ImageIO.read(new File(name)); 
      //Ou getClass().getResource(name), caso você queira que essa imagem vá ficar depois dentro do .jar
   } catch (Exception e) {
      throw new RuntimeException("Não foi possível carregar " + name, e);
   }
}
M

Se você fizer um filho de JComponent, você deve sobrescrevem paintComponent. Se fizer um filho de JFrame ou JApplet, você deve sobrescrever o método paint. Entretanto, a melhor forma mesmo é adotar uma técnica conhecida como escrita direta. Vou explicar sobre isso nos próximos artigos, mas consiste em basicamente obter o objeto BufferStrategy e, você mesmo, chamar os métodos para atualizar os buffers de pintura.

Isso porque o Swing não reaje a um repaint instantaneamente. E ele também pode ignorar repaints dados em intervalos de tempo muito próximos (event coalescing). Essas características são muito boas para UIs, mas péssimas para jogos.

Entendi, obrigado.

Mas BufferStrategy não é usado somente em Window e Canvas? E se minha classe onde o jogo é desenhado extender JPanel, por exemplo?

ViniGodoy

Nesse caso, é no paintComponent mesmo. Mas, a menos que seu jogo não ocupe a janela inteira (o que é muito raro), não tem pq estender JPanel ou JComponent.

G

Vinicius eu não sei se o problema é comigo mas seu código me levou à isso:

Exception in thread AWT-EventQueue-0 java.lang.RuntimeException: Não foi possível carregar player.png

at Panel.loadImage(Jogo.java:35)

at Panel.(Jogo.java:27)

at Jogo.(Jogo.java:57)

at Jogo$1.run(Jogo.java:65)

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)

Caused by: javax.imageio.IIOException: Cant read input file!

at javax.imageio.ImageIO.read(ImageIO.java:1275)

at Panel.loadImage(Jogo.java:32)

 11 more
ViniGodoy

Isso provavelmente quer dizer que ele não achou a imagem. Em que diretório ela está?

Criado 10 de dezembro de 2009
Ultima resposta 11 de dez. de 2009
Respostas 20
Participantes 5