2012-06-02 15 views
5

Khi tôi đang cố gắng tìm ra cách sử dụng các chiến lược đệm, và tổng thể chỉ cải thiện cách tôi viết mã và dọn dẹp mọi thứ. Khi tôi chạy đoạn mã sau, tôi nhận được một lỗi khi tôi "createBufferStrategy (3)"Ngoại lệ nhà nước bất hợp pháp khi tạo Bufferstrategy mới

package Game1Test; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.io.IOException; 

import javax.swing.*; 

public class Base extends Canvas implements Runnable{ 

    private static final long serialVersionUID = 1L; 
    private boolean running = false; 
    int ticks = 0; 

    public Base(JFrame f) { 
     setSize(f.getWidth(),f.getHeight()); 
     start(); 
    } 

    public void start(){ 
     running = true; 
     new Thread(this).start(); 
    } 
    public void stop(){ 

    } 
    public void run(){ 
     while(running){ 
      ticks++; 
      System.out.println(ticks); 
      render(); 

       try { 
        Thread.sleep(2); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
     } 
    } 
    public void render(){ 
     BufferStrategy bs = getBufferStrategy(); 
     Graphics g; 
     if(bs == null){ 
      createBufferStrategy(3); 
      requestFocus(); 
      return; 
     } 
     bs.show(); 
    } 



} 

Các cơ sở sau đó được thêm vào với:

package Game1Test; 

import java.awt.*; 

import javax.swing.JFrame; 

public class Screen extends JFrame{ 

    public final int GAME_WIDTH = 400; 
    public final int GAME_HEIGHT = 400; 
    public Dimension gameDim = new Dimension(GAME_WIDTH,GAME_HEIGHT); 
    final String gameName = "Test"; 

    public Screen(){ 
     setSize(gameDim); 
     setTitle(gameName); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setLayout(new GridLayout()); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 
    public static void main(String[] args){ 
     Screen s = new Screen(); 
     s.add(new Base(s)); 
    } 
} 

tôi nhận được lỗi sau:

Exception in thread "Thread-2" 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 Game1Test.Base.render(Base.java:46) 
    at Game1Test.Base.run(Base.java:33) 
    at java.lang.Thread.run(Unknown Source) 

Ai đó có thể vui lòng cho tôi biết lý do điều này xảy ra không? và có thể là một giải pháp cho vấn đề này?

Cảm ơn

+0

cho mỗi API, ngoại lệ này được ném nếu thành phần không hiển thị. –

+0

@HovercraftFullOfEels Điều đó có nghĩa là gì? – grimrader22

Trả lời

5

Lấy một cái nhìn tại các API, ngoại lệ này được ném nếu thành phần này là không thể hiển thị. Trong trường hợp này, đó là khi Canvas.peernull. Lấy một cái nhìn tại các lĩnh vực peer tiết lộ rằng

The peer is set when the Component is added to a container that also is a peer

Kể từ khi bạn đang bắt đầu thread cập nhật từ constructor của thành phần của bạn, render có thể được gọi trước khi thành phần của bạn là bao giờ thêm vào thùng chứa khác mà sẽ có nghĩa là peernull, và thì IllegalStateException sẽ bị ném.

+0

Xin lỗi nếu tôi là ngu ngốc, nhưng khi là thành phần được thêm vào, đó là những gì tôi đang bối rối về, khi shuold tôi gọi phương thức render? – grimrader22

+0

Bạn chỉ nên gọi phương thức 'render' * sau *' Base' đã được thêm vào vùng chứa. Trong mã bạn đã cho chúng tôi thấy, 'Base' không bao giờ được thêm vào một vùng chứa. – Jeffrey

+0

Tôi chỉ cần thêm mã cơ bản, nó sẽ tốt hơn Nếu tôi đặt tất cả trong một lớp? – grimrader22

3

Theo kinh nghiệm của tôi với lỗi này và với mã bạn viết, bạn thiếu chức năng khung.

Thêm nơi khung của bạn (ví dụ: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);) và thêm chức năng frame.add(game);

Trong ví dụ này, tôi là Display game = new Display(); nhưng tùy thuộc vào những gì biến của bạn cho màn hình hiển thị mới, nó có thể khác nhau.

Các vấn đề liên quan