Excepción de estado ilegal al crear una nueva estrategia de Buffers

Cuando estoy tratando de descubrir cómo usar estrategias de búfer, y en general solo estoy mejorando la forma en que escribo mi código y la limpieza. Cuando ejecuto el siguiente código, aparece un error cuando “createBufferStrategy (3)”

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

La Base se agrega con:

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

Obtuve el siguiente error:

 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.(Unknown Source) at java.awt.Component$FlipSubRegionBufferStrategy.(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) 

¿Puede alguien decirme por qué sucede esto? y tal vez una solución a este problema?

Gracias

Al observar la API , se lanza esta excepción si el componente no se puede visualizar. En este caso, es cuando Canvas.peer es null . Echar un vistazo al campo de peer revela que

El par se establece cuando el Component se agrega a un contenedor que también es un par

Como está iniciando el hilo de actualización desde el constructor de su componente, se podría IllegalStateException render antes de que su componente sea agregado a otro contenedor, lo que significaría que el peer es null , y luego se IllegalStateException una IllegalStateException .

En mi experiencia con este error y con el código que escribes te falta una función de marco.

Agregue dónde están sus marcos (por ejemplo: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ) y agregue la función frame.add(game);

En este ejemplo, el mío es Display game = new Display(); pero dependiendo de cuál sea tu variable para la nueva pantalla, puede variar.