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