Java双缓冲只会产生一个灰色的屏幕

Java双缓冲只会产生一个灰色的屏幕,java,graphics,double,game-engine,buffering,Java,Graphics,Double,Game Engine,Buffering,我正在为一个班级项目做一个简单的游戏,但无法在屏幕上绘制我的图像。 这是我的JFrame,它充当用户界面 import java.awt.image.BufferStrategy; import java.awt.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import java.awt.event.KeyListener; import java.a

我正在为一个班级项目做一个简单的游戏,但无法在屏幕上绘制我的图像。 这是我的JFrame,它充当用户界面

import java.awt.image.BufferStrategy;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

public class MMFrame extends JFrame {
int w;
int h;
boolean exit = false;
BufferStrategy buffer;
GameInputHandler gih;
Canvas canvas = new Canvas();
public MMFrame(){
    w = 768;
    h = 768;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setUndecorated(true);
this.setSize(w,h);
this.setVisible(true);
    this.setLocation((screenSize.width /2)-410, (screenSize.height /2)-310);
this.createBufferStrategy(2);


    canvas.setIgnoreRepaint( true );
    canvas.setSize( 768, 768 );
    gih = new GameInputHandler(this);

    canvas.addKeyListener(new KeyListener() {

        @Override
         public void keyPressed(KeyEvent e) {
                   gih.ProcessKey(e);   // --make an input handler       

          }                          

        @Override
        public void keyTyped(KeyEvent ke) {
                //gih.ProcessKey(ke);
           //throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        public void keyReleased(KeyEvent ke) {
           // throw new UnsupportedOperationException("Not supported yet.");
        }

    }); //end of key listener




    this.add(canvas);




}


public void setExit(boolean b){
    exit = b;
}

public void drawStuff(Image img) {
    buffer = this.getBufferStrategy();
    Graphics graphics = null;
try {
        // clear back buffer...
        graphics = buffer.getDrawGraphics();
        graphics.drawImage(img, 0, 0, this);

        if( !buffer.contentsLost() ){
         //System.out.println("Buffer contents not lost.");
         buffer.show();
         //this.repaint();
        } else {
         //System.out.println("Buffer contents lost.");
        }

        // Let the OS have a little time...
        Thread.yield();
     } finally {
        if( graphics != null ) 
         graphics.dispose();

        }
     }


      }
这是我的主要游戏循环

public class MouseMazeClient {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
   //statemanager to handle state changes as game runs 
   StateManager SM = new StateManager(); 
   MMFrame GameWindow = new MMFrame(); 
   RenderEngine R = new RenderEngine();

   Graphics g;
   Image i;



    while (GameWindow.exit == false){
        //main render loop




        i = R.RenderFrame(SM.GetCurrentID());
        GameWindow.drawStuff(i);
        try {
           Thread.sleep(30);
        } catch (InterruptedException ex) {
           Logger.getLogger(MMFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

  System.exit(0);



  }
}
我的想法是,我的渲染引擎将运行以下代码:

 public class RenderEngine {
Image RenderFrame(int state){
    Image z;


    switch (state){
        case 1:
            z = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/imgs/mm-title.jpg"));
        break;

        default:
            z = null;
            //oops.                
    }

    return z;
}
}


显然,随着我编写代码来处理更多的状态,复杂性也在增加——我知道程序会将其放入案例1:fork我的渲染逻辑,因为我在其中放入了println。我想我可能把我的战略搞砸了。任何帮助都将不胜感激。

哦,等一下。我想我明白了。这是一幅油画;canvas.createBufferStrategy2;buffer=canvas.getBufferStrategy;就在我的框架声明的末尾。我必须添加画布,然后在画布上创建一个缓冲策略。