使用BuffereImage dosn'在Java中进行双缓冲;不显示图像

使用BuffereImage dosn'在Java中进行双缓冲;不显示图像,java,swing,graphics,bufferedimage,Java,Swing,Graphics,Bufferedimage,我正试图使用BufferedImage在run()方法中加倍缓冲我的屏幕。它不显示图像(尽管它显示了由g.drawRect等绘制的其他图形)。 我正在尝试实现活动渲染,因此我的绘画不是在paintComponent中,而是在我自己的方法中。当我把它放在paintComponent中时,它确实起作用了。。。。 有人知道问题出在哪里吗 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import

我正试图使用
BufferedImage
run()
方法中加倍缓冲我的屏幕。它不显示图像(尽管它显示了由
g.drawRect
等绘制的其他图形)。 我正在尝试实现活动渲染,因此我的绘画不是在
paintComponent
中,而是在我自己的方法中。当我把它放在
paintComponent
中时,它确实起作用了。。。。 有人知道问题出在哪里吗

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JPanel;


public class GamePanel extends JPanel implements Runnable
{
private static final int PWIDTH = 500, PHEIGHT = 500, PERIOD = 40;
private Image bgImage;
private BufferedImage dbImg = null;
private boolean running; 

public GamePanel()
{
    bgImage = Toolkit.getDefaultToolkit().getImage((new File(".")).getAbsolutePath() + "//a.jpg");

}

public void run()
{

    long before, diff, sleepTime;
    before = System.currentTimeMillis();
    running = true;
    int x = 1;
    while(x <= 5)
    {
        gameRender();
        paintScreen();   // active rendering

        try {
            Thread.sleep(50);
        }
        catch(InterruptedException e){}

        x++;
    }

}

// only start the animation once the JPanel has been added to the JFrame
public void addNotify()
{ 
    super.addNotify();   // creates the peer
    startGame();    // start the thread
}
public void startGame()
{
    (new Thread(this)).start();
}
public void gameRender()
{
    Graphics dbg;

    dbImg = new BufferedImage(PWIDTH, PHEIGHT, BufferedImage.TYPE_INT_ARGB);
  //  dbImg = (BufferedImage)createImage(PWIDTH, PHEIGHT);
    dbg = dbImg.getGraphics();
    dbg.setColor(Color.GREEN);
    dbg.fillRect(0, 0, PWIDTH, PHEIGHT);
    dbg.drawImage(bgImage, 0, 0, null); // doesn't show

    dbg.setColor(Color.ORANGE);  // this one shows
    dbg.fillRect(100, 100, 100, 100);

}
public void paintScreen()
{
    Graphics g;
    try {
        g = getGraphics();
        if(g != null && dbImg != null)
        {
            g.drawImage(dbImg, 0, 0, null);
        }
    }
    catch(Exception e)
    {
        System.out.println("Graphics error");
        e.printStackTrace();
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Toolkit;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.image.buffereImage;
导入java.io.File;
导入javax.swing.JPanel;
公共类GamePanel扩展JPanel实现可运行
{
专用静态最终int PWIDTH=500,PHEIGHT=500,周期=40;
私有图像;
私有缓冲区映像dbImg=null;
私有布尔运行;
公共游戏小组()
{
bgImage=Toolkit.getDefaultToolkit().getImage((新文件(“.”).getAbsolutePath()+”//a.jpg”);
}
公开募捐
{
很久以前,不同的睡眠时间;
before=System.currentTimeMillis();
运行=真;
int x=1;

虽然(x
getGraphics
不是自定义绘制的方式,但有关更多详细信息,请参阅

你应该考虑有一个主动的和被动的缓冲区。主动缓冲区是应该被画到屏幕上的,而被动缓冲区应该是被更新的。这将确保你不会结束一个脏的更新,这是对缓冲器的部分更新被绘制到屏幕上。 更新完成后,您将交换缓冲区并请求重新绘制。为了更安全,在交换缓冲区和绘制时,应在

同步的
块中进行


话虽如此,Swing组件在默认情况下是双缓冲的

getGraphics
不是如何进行自定义绘制的,有关更多详细信息,请参阅

你应该考虑有一个主动的和被动的缓冲区。主动缓冲区是应该被画到屏幕上的,而被动缓冲区应该是被更新的。这将确保你不会结束一个脏的更新,这是对缓冲器的部分更新被绘制到屏幕上。 更新完成后,您将交换缓冲区并请求重新绘制。为了更安全,在交换缓冲区和绘制时,应在

同步的
块中进行


话虽如此,Swing组件在默认情况下是双缓冲的

getGraphics
不是如何进行自定义绘制的,有关更多详细信息,请参阅

你应该考虑有一个主动的和被动的缓冲区。主动缓冲区是应该被画到屏幕上的,而被动缓冲区应该是被更新的。这将确保你不会结束一个脏的更新,这是对缓冲器的部分更新被绘制到屏幕上。 更新完成后,您将交换缓冲区并请求重新绘制。为了更安全,在交换缓冲区和绘制时,应在

同步的
块中进行


话虽如此,Swing组件在默认情况下是双缓冲的

getGraphics
不是如何进行自定义绘制的,有关更多详细信息,请参阅

你应该考虑有一个主动的和被动的缓冲区。主动缓冲区是应该被画到屏幕上的,而被动缓冲区应该是被更新的。这将确保你不会结束一个脏的更新,这是对缓冲器的部分更新被绘制到屏幕上。 更新完成后,您将交换缓冲区并请求重新绘制。为了更安全,在交换缓冲区和绘制时,应在

同步的
块中进行

话虽如此,Swing组件在默认情况下是双缓冲的