我想通过重写我的JPanel的更新方法来实现我的游戏在Java中的双重缓冲,我做所有常见的代码等,仍然不会工作,它抛出一个堆栈溢出错误,下面是具体的错误:使用覆盖更新方法的Java双缓冲区抛出堆栈溢出
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.awt.Rectangle.<init>(Rectangle.java:193)
at java.awt.Rectangle.<init>(Rectangle.java:208)
at sun.awt.image.BufImgSurfaceData.getBounds(BufImgSurfaceData.java:369)
at sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:533)
at sun.java2d.loops.GraphicsPrimitive.convertFrom(GraphicsPrimitive.java:523)
at sun.java2d.loops.MaskBlit$General.MaskBlit(MaskBlit.java:171)
at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Blit.java:186)
at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:927)
at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:550)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:54)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:982)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2979)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2964)
at epicgame.Menu.displayMenu(Menu.java:71)
at epicgame.GUI$1.paintComponent(GUI.java:64)
at javax.swing.JComponent.paint(JComponent.java:1029)
at epicgame.GUI$1.update(GUI.java:117)
at epicgame.GUI$1.paintComponent(GUI.java:98)
at javax.swing.JComponent.paint(JComponent.java:1029)
我的代码是不是特别复杂或者:
mainPanel = new JPanel()
{
@Override protected void paintComponent(Graphics g)
{
//super.paintComponent(g);
if(menuEnabled == 1)
{
Menu.displayMenu(g, mainPanel);
}
else if(gameNum == 1)
{
StreetFighter.StreetFighter(g, mainPanel);
// Calls the controls method within the controls class.
Controls.controls(Calendar.getInstance().getTimeInMillis() - timeOld);
timeOld = Calendar.getInstance().getTimeInMillis();
}
else if(gameNum == -1)
{
Menu.scoreBoard(g, mainPanel);
if(loaded != true)
{
Menu.loadScoreBoard(mainPanel);
loaded = true;
}
}
if(gameNum > 0)
{
if(longcat == true && longcatloaded != true)
{
Extras.loadLongCat();
longcatloaded = true;
}
if(longcatloaded == true && longcat == true)
{
Extras.displayLongCat(g, mainPanel);
}
}
// Causes an infinite loop, e.g makes the screen render over and over.
//repaint();
update(g);
}
@Override public void update(Graphics g)
{
System.err.println("Updating screen and using double buffer!");
// initialize buffer
if(dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics();
}
// clear screen in background
dbg.setColor (getBackground());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// draw elements in background
dbg.setColor (getForeground());
paint(dbg);
// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
try
{
Thread.sleep(200);
}
catch (InterruptedException ex)
{
System.err.print("cant delay repaint.");
}
}
};
我希望有人能指出我哪里错了,我我想这可能与更新被调用的次数有关,或者可能的更新是错误的方法?
我会用什么来双缓冲呢? – 2011-03-19 03:11:16
+1 Double缓冲是'JPanel'的一个特性;只需使用相关的构造函数。这是一个[示例](http://stackoverflow.com/questions/3256941)。 – trashgod 2011-03-19 03:17:23