Java 为什么我的JPanel没有绘制我的BuffereImage?

Java 为什么我的JPanel没有绘制我的BuffereImage?,java,swing,jpanel,game-engine,Java,Swing,Jpanel,Game Engine,因此,我正在制作一个简单的2D游戏引擎,以了解更多关于JavaSwing的知识,并将其作为我可以在未来项目中重用的东西。我有一个名为Canvas的类,它扩展了JPanel并将包含渲染精灵的所有代码,等等。现在我有一个名为paintSprites()的方法,它将为每个精灵完成所有绘制步骤,它将管理背景颜色并将其绘制到BufferedImage对象(有点像双缓冲)然后,在我的paintComponent()方法中,它只是将这个buffereImage对象绘制到屏幕上method,我只是画了一个绿色的

因此,我正在制作一个简单的2D游戏引擎,以了解更多关于JavaSwing的知识,并将其作为我可以在未来项目中重用的东西。我有一个名为
Canvas
的类,它扩展了
JPanel
并将包含渲染精灵的所有代码,等等。现在我有一个名为
paintSprites()
的方法,它将为每个精灵完成所有绘制步骤,它将管理背景颜色并将其绘制到
BufferedImage
对象(有点像双缓冲)然后,在我的
paintComponent()
方法中,它只是将这个
buffereImage
对象绘制到屏幕上method,我只是画了一个绿色的正方形。但是,当我运行程序时,窗口会出现,但它是完全空白的。下面是我的代码:

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\u INT\u RGB
时,窗口有一个带白色正方形的黑色背景,但我尝试了不同的图像类型,但似乎都不起作用)。

paintSprites()
getGraphics()
更改为
createGraphics())
根据“为我修正it”的建议:

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;
}

但是,我找不到解释原因的ressource。

我尝试了切换方法,但从我所看到的情况来看,至少在这种情况下,它们有些相同。事实上,建议使用
paintComponent()
,请参见@D.Sikilai,覆盖的正确方法是
paintComponent(…)
。有关更多信息和工作示例,请阅读Swing教程中关于[Custom Paint]()的部分。哇,太感谢了!不知道为什么这样做有效,而不是getGraphics,但我会接受它。