2012-06-02 2 views
5

Когда я пытаюсь понять, как использовать bufferstrategies, и в целом просто улучшаю, как я пишу свой код и чищу вещи. Когда я запускаю следующий код, я получаю сообщение об ошибке, когда я "createBufferStrategy (3)"Illegal State Exception при создании новой Bufferstrategy

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(); 
    } 



} 

База затем добавляют:

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)); 
    } 
} 

Я получаю следующее сообщение об ошибке:

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) 

Может кто-нибудь, пожалуйста, скажите мне, почему это происходит? и, возможно, решение этой проблемы?

Благодаря

+0

за API, это исключение выдается, если компонент не отображается. –

+0

@HovercraftFullOfEels Что именно это означает? – grimrader22

ответ

5

Взглянув на API, это исключение, если компонент не является отображаемым. В этом случае Canvas.peer - null. Взглянув на peer поле показывает, что

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

Поскольку вы начинаете поток обновлений из конструктора вашего компонента, render можно назвать, прежде чем ваш компонент либо добавляют в другой контейнер, который будет означать, что peer является null, и то будет выброшен IllegalStateException.

+0

Извините, если я глуп, но когда добавлен компонент, это то, о чем я запутался, когда shuold называю метод визуализации? – grimrader22

+0

Вы должны вызывать метод 'render' * только после того, как' 'Base 'был добавлен в контейнер. В коде, который вы нам показали, «База» никогда не добавляется в контейнер. – Jeffrey

+0

Я просто добавил базовый код, было бы лучше, если бы все это было в одном классе? – grimrader22

3

В моем опыте с этой ошибкой и с кодом, который вы пишете, отсутствует функция кадра.

Добавить, где ваши кадры (например: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);) и добавить функцию frame.add(game);

В этом примере, шахта Display game = new Display();, но в зависимости от того, что переменная для нового дисплея, оно может меняться.

Смежные вопросы