为什么我的 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;
}
但是我找不到解释原因的资源。
所以我正在使自己成为一个简单的小型 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;
}
但是我找不到解释原因的资源。