2013-11-15 29 views
0

的時候,當我試圖創建一個與BufferStrategy中爲createBufferStrategy(2)雙緩衝,我得到這個錯誤:java.lang.IllegalStateException創建BufferStrategy中

Exception in thread "main" java.lang.IllegalStateException: Component must have a valid peer 
    at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source) 
    at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source) 
    at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source) 
    at java.awt.Component.createBufferStrategy(Unknown Source) 
    at java.awt.Canvas.createBufferStrategy(Unknown Source) 
    at java.awt.Component.createBufferStrategy(Unknown Source) 
    at java.awt.Canvas.createBufferStrategy(Unknown Source) 
    at SpritePractice.render(SpritePractice.java:87) 
    at SpritePractice.run(SpritePractice.java:67) 
    at SpritePractice.start(SpritePractice.java:100) 
    at SpritePractice.init(SpritePractice.java:48) 
    at SpritePractice.<init>(SpritePractice.java:41) 
    at SpritePractice.main(SpritePractice.java:108) 

而且我的代碼是:

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import javax.swing.JFrame; 

public class SpritePractice extends Canvas implements Runnable{ 

private JFrame frame; 
private final static int WIDTH = 200, HEIGHT = 200; 
private final static int SCALE = 2; 
private final static Dimension dimens= new Dimension(WIDTH*SCALE, HEIGHT*SCALE); 
private BufferedImage image; 
private Graphics g; 
private long nanoSecond = 1000000000; 
private double tick = nanoSecond/60; 
private boolean running = false; 
private int pixelsFromImage[]; 
private int pixel[][]; 
private static DateFormat dateFormat = new SimpleDateFormat("[" + "yyyy/MM/dd HH:mm:ss" 
     +"]"); 
private static DateFormat dateFormat2 = new SimpleDateFormat("[" + "HH:mm:ss" + "]"); 

public SpritePractice() 
{ 
    frame = new JFrame("Bomberman"); 
    frame.setSize(dimens); 
    frame.setMinimumSize(dimens); 
    frame.setMaximumSize(dimens); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    init(); 
} 
public void init() 
{ 
    long startTime = System.nanoTime(); 
    Calendar cal = Calendar.getInstance(); 
    System.out.println("START: " + dateFormat.format(cal.getTime())); 
    start(); 
} 

public void run() 
{ 
    long now = System.nanoTime(); 
    long lastTick = System.nanoTime(); 
    long lastSecond = System.nanoTime(); 
    int frames = 0; 

    while(running) 
    { 
     now = System.nanoTime(); 
     Calendar cal = Calendar.getInstance(); 

     if(now-lastTick >= tick) 
     { 
      lastTick = now; 
      tick(); 
      render(); 
      frames++; 
     } 
     if(now-lastSecond >= nanoSecond) 
     { 
      lastSecond = now; 
      System.out.println(dateFormat2.format(cal.getTime()) + "FPS: " + frames); 
      frames = 0; 
     } 
    } 
} 
public void tick() 
{ 
    //updates values 
} 
public void render() 
{ 
    BufferStrategy bs = getBufferStrategy(); 
    if(bs==null) 
    { 
     createBufferStrategy(2); 
     return; 
    } 
    Graphics g = bs.getDrawGraphics(); 
    g.fillRect(0, 0, WIDTH, HEIGHT); 
    g.setColor(Color.BLACK); 
    g.dispose(); 
    bs.show(); 
    //renders graphics 
} 
public synchronized void start() 
{ 
    running = true; 
    run(); 
} 
public synchronized void stop() 
{ 
    running = false; 
} 
public static void main(String[] args) 
{ 
    new SpritePractice(); 
} 

}

回答

0

您必須將您的實例添加到框架,因爲如果您沒有無法顯示畫布。有了它,它應該可以工作:

frame.add(this); 
+0

謝謝你的工作! –

0

您的SpritePractice實例不可見。您尚未將其添加到您創建的框架中。

相關問題