为什么我的JPanel无法绘制我的BufferedImage?

问题描述

因此,我正在使自己成为一个简单的小型2D游戏引擎,以了解有关Java swing的更多信息,并可以将其用于将来的项目。我有一个名为Canvas的类,它扩展了JPanel,并将包含所有用于渲染精灵的代码,等等。现在,我有一个名为paintSprites()方法,它将通过以下所有绘制步骤:每个精灵,它将管理背景颜色并将其绘制到BufferedImage对象(有点像双重缓冲),然后在我的paintComponent()方法中,它仅将此BufferedImage对象绘制到屏幕。仅出于测试目的,在我的paintSprites()方法中,我只是在绘制一个绿色正方形。但是,当我运行该程序时,将显示该窗口,但它完全是空白的。这是我的代码

package gui;

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;

import java.awt.image.BufferedImage;

import game.Game;

public class Canvas extends JPanel implements Runnable{

  private Color background = Color.WHITE;
  private double targetFPS = 60.0;
  private Thread renderer;
  private boolean render = true;
  private Game parent;
  private BufferedImage temp;

  public Canvas(Game parent){
    super();

    this.parent = parent;

    renderer = new Thread(this);
    renderer.start();
  }

  public void setBackgroundColor(Color c){
    background = c;
  }

  public void startRendering(){
    render = true;
  }

  public void stopRendering(){
    render = false;
  }

  public void setTargetFPS(double d){
    targetFPS = d;
  }

  public void paintComponent(Graphics g){
    g.setColor(background);
    g.fillRect(0,getWidth(),getHeight());
    g.drawImage(temp,null);
    System.out.println("Painted Component");
  }

  public BufferedImage paintSprites(){
    BufferedImage out = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);


    out.getGraphics().setColor(Color.WHITE);
    out.getGraphics().fillRect(0,getHeight());
    out.getGraphics().setColor(Color.GREEN);
    out.getGraphics().fillRect(10,10,50,50);

    out.getGraphics().dispose();
    return out;
  }

  public void run(){
    while(true){
      if(!render) continue;

      try{Thread.sleep((long)(1000.0/targetFPS));} catch(InterruptedException ex){}


      BufferedImage dbImage = paintSprites();
      temp = dbImage;
      repaint();
    }
  }
}

(另外,我认为这可能与缓冲的图像类型有关,因为当我将其更改为TYPE_INT_RGB时,窗口的背景为黑色,带有白色正方形,但是我尝试了不同的图像类型,似乎没有任何作用。

解决方法

根据tutorial的建议,将paintSprites()getGraphics()更改为createGraphics()

public BufferedImage paintSprites() {
    BufferedImage out =
        new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_ARGB);

    Graphics2D g = out.createGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0,getWidth(),getHeight());
    g.setColor(Color.GREEN);
    g.fillRect(100,100,50,50);

    g.dispose();
    return out;
}

但是我找不到解释原因的资源。