[Resolvido]Como utilizar BufferStrategy em imagens carregadas exteriormente

3 respostas
V

Olá pessoal, tudo bom?

Estou com uma dificuldade em uns testes de Buffer que estou fazendo.
No momento estou importando uma imagem PNG para seguir o cursor do mouse dentro de uma JFrame, mas ela pisca constantemente por não ter nenhum buffer.
Estou utilizando o createBufferStrategy(num) para amenizar isso. Já consegui fazer com imagens que eu mesmo contruí por código, mas com imagens externas não consigo.

O código:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class BufferImagem extends JFrame implements MouseMotionListener{
    int dimX, dimY, curX, curY;
    Image imagem;

    public BufferImagem() throws IOException {
        super("Teste com Buffer Duplo com Imagem");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dimX = 600;
        dimY = 600;
        setVisible(true);
        setResizable(false);
        setBounds(350,250,dimX,dimY);
        addMouseMotionListener(this);
        createBufferStrategy(2);

        String minhaImagem = "C:/Users/Vítor Batista/Desktop/Imagem.png";
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        imagem = toolkit.getImage(minhaImagem);
        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(imagem, 0);
    }    

    public void paint(Graphics g){
        BufferStrategy bf = this.getBufferStrategy();

        try{
            //g = bf.getDrawGraphics(); //Aqui está o problema. 
            //Quando tento adicionar o BufferStrategy, a imagem não aparece. Sem essa linha a imagem fica piscando.
            g.clearRect(0,0,dimX,dimY);
            g.drawImage(imagem, curX, curY, null);
        }finally{
            g.dispose();
        }

    }

    public void mouseDragged(MouseEvent e) {
        curX = e.getX();
        curY = e.getY();
        repaint();
    }

    public void mouseMoved(MouseEvent e) {
        curX = e.getX();
        curY = e.getY();
        repaint();
    }
}

Qual seria a solução?
Agradeço a atenção.

3 Respostas

V
  1. Não use o MediaTracker, use o ImageIO;
    http://www.pontov.com.br/site/index.php/java/48-java2d/111-trabalhando-com-imagens

  2. Se você for usar o BufferStrategy, você deve usar escrita direta e não o método paint:
    http://www.pontov.com.br/site/index.php/java/48-java2d/124-desenho-direto-active-rendering

  3. Se você não for usar o BufferStrategy, você deve usar o paintComponent e não o paint.

  4. Aproveite e leia com atenção todos os tutoriais de Java2D do ponto V, em especial sobre o loop de animação:
    http://www.pontov.com.br/site/index.php/java/48-java2d

V

Opa!

Valeu ViniGodoy, vou ver esses links agora mesmo.
Sobre o ImageIO, eu estava até usando antes, mas depois eu mudei para o MediaTraker pensando que ai dar certo. Até tinha importado o javax.imageio

Abraços.

V

Li sobre o conteúdo que estava no link, achei bem interessante. Mas ainda estou com dúvida.

Alterei o paint(Graphics g) para desenhar():
public void desenhar(){
         Graphics g = getBufferStrategy().getDrawGraphics();

        try{
            g.clearRect(0,0,dimX,dimY);
            g.drawImage(imagem, curX, curY, null);
            getBufferStrategy().show();
        }finally{
            g.dispose();
        }

    }
E substitui o ToolKit pelo ImageIO:
String minhaImagem = "C:/Users/Vítor Batista/Desktop/TrollFace.png"; //Não coloquei Try/Catch porque não preciso saber se já carregou.
BufferedImage imagem = ImageIO.read(new File(minhaImagem));

Mas a imagem não exibe, pesquisei na Biblioteca Oracle do Java e não encontrei algo que exibia na tela a imagem.
Estou me perguntando se o "g.drawImage(imagem, curX, curY, null);" é válido para o que estou fazendo.

Edit--------------------------------------------------------------------------------------------------

Mal postei e aterei umas coisas aqui e acabei conseguindo efetuar o Buffer.
public String minhaImagem = "C:/Users/Vítor Batista/Desktop/TrollFace.png";
public BufferedImage imagem = ImageIO.read(new File(minhaImagem));

Só tive que jogar essas linhas no construtor do JFrame como publico.

Agradeço pela ajuda.
Flw.

Criado 6 de março de 2011
Ultima resposta 10 de mar. de 2011
Respostas 3
Participantes 2