在Java中绘制到backbuffer的问题

时间:2014-12-24 13:13:15

标签: java swing graphics paint

我想绘制一个后备缓冲区,然后在JPanel上显示,但我无法将图纸应用到它,它只会显示为完全黑屏。

有什么想法吗?

我目前的代码:

public class Game extends JPanel {

    int screenWidth = 1280;
    int screenHeight = 720;
    BufferedImage backbuffer;
    Graphics2D g2d;
    AffineTransform at = new AffineTransform();
    Polys polygon = new Polys();

    public void init() {
        backbuffer = new BufferedImage(screenWidth, screenHeight, BufferedImage.TYPE_INT_RGB);
        g2d = backbuffer.createGraphics();
    }

    public void update(Graphics g) {
        g2d.setColor(Color.PINK);
        g2d.fillRect(0, 0, screenWidth, screenHeight);
        drawStuff();
        paint(g);
    }

    public void drawStuff() {
        g2d.setTransform(at);
        g2d.translate(10, 10);
        g2d.setColor(Color.BLACK);
        g2d.drawPolygon(polygon.getPoly());
    }

    public void paint(Graphics g) {
        g.drawImage(backbuffer, 0, 0, this);
    }

    Game() {
        setPreferredSize(new Dimension(screenWidth, screenHeight));
        init();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Game Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.getContentPane().add(new Game());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:1)

  

由于某些原因,它可以使用Canvas但不能使用JPanel(使用paintComponent)。 update()不会被paintComponent调用吗?

不要覆盖update()方法。这是旧的AWT代码,并没有在Swing中完成。在创建BufferedImage时,可以在构造函数中完成对BufferedImage的绘制。但一般来说,当图像是静态的时,你只会使用BufferedImage。

在你的情况下,我建议你不需要BufferedImage。只需在paintComponent(...)方法中执行所有自定义绘制。