为什么我的 JPanel 不绘制我的 BufferedImage?

Why is my JPanel not drawing my BufferedImage?

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

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,0,getWidth(), getHeight());
    g.drawImage(temp,0,0,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, 0, getWidth(), 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 时,window 具有黑色背景和白色方块,但我尝试了不同的图像类型,none 似乎有效)。

按照 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, 0, getWidth(), getHeight());
    g.setColor(Color.GREEN);
    g.fillRect(100, 100, 50, 50);

    g.dispose();
    return out;
}

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