Illegal State Exception beim erstellen von neuen Bufferstrategy
Wenn ich versuche, herauszufinden, wie man bufferstrategies, und insgesamt nur zu verbessern, wie Schreibe ich meinen code und Reinigung Dinge. Wenn ich den folgenden code ausführen, ich erhalte eine Fehlermeldung, wenn ich "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();
}
}
Die Basis wird dann Hinzugefügt:
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));
}
}
Bekomme ich die folgende Fehlermeldung:
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)
Kann mir bitte jemand sagen, warum dies passiert ist? und vielleicht eine Lösung zu diesem problem?
Dank
pro die API, diese Ausnahme wird geworfen, wenn die Komponente nicht darstellbar.
Was genau bedeutet das?
Was genau bedeutet das?
InformationsquelleAutor matthewtory | 2012-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich ein Blick auf die API, diese Ausnahme wird geworfen, wenn die Komponente nicht darstellbar. In diesem Fall, das ist, wenn
Canvas.peer
istnull
. Ein Blick auf diepeer
Feld zeigt, dassDa Sie das update starten, den thread aus der Komponente Konstruktor
render
genannt werden könnte, bevor die Komponente wird immer Hinzugefügt, um einen anderen container, was bedeuten würde, diepeer
istnull
, und dann einIllegalStateException
würde geworfen werden.Sollten Sie nur nennen, die
render
Methode nachdemBase
wurde einem container Hinzugefügt. In dem code, den Sie uns zeigte,Base
nie einem container Hinzugefügt.Ich habe gerade das Basis-code, wäre es besser, Wenn ich Sie alle in eine Klasse?
Das problem ist, dass in der Zeit zwischen dem erstellen Sie
Base
und es wird Hinzugefügt, umScreen
die update-Threads, die Sie gestartet haben vielleicht schon genanntrender
. Sie müssen entweder rufenstart
getrennt vonBase
's Konstruktor oder fügen SieBase
zu denJFrame
imBase
's Konstruktor vor dem Aufrufstart
.also ich unwirksam Aufruf der start-Methode In der main Klasse wo die main Methode ist?
InformationsquelleAutor Jeffrey
Meine Erfahrung mit diesem Fehler und mit dem code, den Sie schreiben, Ihnen fehlt ein frame-Funktion.
Hinzufügen, wo deine frames sind (ex:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
) und fügen Sie die Funktionframe.add(game);
In diesem Beispiel, mir ist
Display game = new Display();
aber je nachdem, was deine Variablen für das neue display ist, es kann variieren.InformationsquelleAutor Stanley Dharan
Ich hatte genau die gleiche Ausnahme, aber ich fand heraus, dass es war, weil mein JFrame die Sicht war versehentlich auf false gesetzt.
damit Putin in die setVisible-Methode(true); behoben.
InformationsquelleAutor Luke