Illégale de l'État d'Exception lors de la création de nouveaux Bufferstrategy
Quand je suis à essayer de comprendre comment utiliser bufferstrategies, et en général seulement à améliorer la façon dont j'écris mon code et le nettoyage des choses. Lorsque j'exécute le code suivant, j'ai une erreur quand je "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 est ajoutée:
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));
}
}
J'obtiens l'erreur suivante:
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)
Quelqu'un peut-il me dire pourquoi ce qui se passe? et peut-être une solution à ce problème?
Grâce
par l'API, cette exception est levée si le composant n'est pas affichables.
Qu'est-ce exactement est-ce à dire?
Qu'est-ce exactement est-ce à dire?
OriginalL'auteur matthewtory | 2012-06-02
Vous devez vous connecter pour publier un commentaire.
De prendre un coup d'oeil à la API, cette exception est levée si le composant n'est pas affichables. Dans ce cas, c'est quand
Canvas.peer
estnull
. En prenant un coup d'oeil à lapeer
de terrain révèle quePuisque vous commencez la mise à jour de filetage à partir de votre composant du constructeur,
render
pourrait être appelée avant que le composant est inclus dans un autre récipient qui serait un moyen depeer
estnull
, puis unIllegalStateException
serait jeté.Vous devez seulement appeler les
render
méthode aprèsBase
a été ajouté à un conteneur. Dans le code que tu nous a montré,Base
est de ne jamais être ajouté à un conteneur.Je viens d'ajouter le code de base, il serait mieux Si j'ai mis tout ça dans une classe?
Le problème est qu'entre le moment où vous créez
Base
et il est ajouté àScreen
, la mise à jour de fil que vous avez commencé peut-être déjà appelérender
. Vous devez appelerstart
séparément deBase
's, le constructeur ou l'ajouterBase
à laJFrame
dansBase
'constructeur avant d'appelerstart
.j'ai donc shuold appel de la méthode start, Dans la catégorie principale où la méthode principale est?
OriginalL'auteur Jeffrey
Dans mon expérience avec ce message d'erreur avec le code que vous avez écrit vous manque une fonction d'encadrement.
Ajouter où vos images sont (ex:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
) et d'ajouter la fonctionframe.add(game);
Dans cet exemple, le mien est
Display game = new Display();
mais selon ce que votre variable pour le nouvel affichage, il peut varier.OriginalL'auteur Stanley Dharan
J'ai eu exactement la même exception, mais j'ai trouvé que c'était parce que ma JFrame visibilité a été accidentellement mis à false.
afin de les ranger dans setVisible(true); il fixe.
OriginalL'auteur Luke