Exception bei BufferStrategy

skappler

Aktives Mitglied
Hallo,
ich bin gerade dabei mit einem Tutorial eine Art 2D Spiele Engine zu bauen.
Ich habe den gesamten Code wie im Tutorial abgetippt, aber erhalte eine Exception:

Exception in thread "Thread-3" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3843)
at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3817)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4358)
at java.awt.Component.createBufferStrategy(Component.java:3699)
at java.awt.Canvas.createBufferStrategy(Canvas.java:166)
at java.awt.Component.createBufferStrategy(Component.java:3623)
at java.awt.Canvas.createBufferStrategy(Canvas.java:141)
at spritesheet.State.render(State.java:60)
at spritesheet.MenuState.render(MenuState.java:26)
at spritesheet.State.run(State.java:79)
at java.lang.Thread.run(Thread.java:680)


Das ganze Konstrukt ist relativ komplex deshalb ist es einiges an Code.
Main.java
Java:
package spritesheet;

import java.awt.Graphics;
import javax.swing.JFrame;

public class Main extends JFrame {
    
    public static final int GAME_WIDTH = 800, GAME_HEIGHT = 600;
    
    StateManager sm;
    
    public Main(){
        init();
        setSize(GAME_WIDTH, GAME_HEIGHT);
        setVisible(true);
        setResizable(false);
        setTitle("Canvas");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
    
    private void init(){
        sm = new StateManager(this);
        sm.setCurrentState("MenuState");
        sm.startCurrentState();
    }
    
    
    
    public static void main(String[] args) {
        Main main = new Main();
    }
}

State.java
Java:
package spritesheet;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;


public class State extends Canvas implements Runnable {
	
	public InputHandler inputManager;
    
    private volatile boolean running = false;
    
    private long ticks = 0;
    
    
    public BufferedImage screen = new BufferedImage(Main.GAME_WIDTH, Main.GAME_HEIGHT, BufferedImage.TYPE_INT_RGB);
    private Graphics2D g = screen.createGraphics();
    
    public String name;
        
    public State(String s){
    	
        name = s;
        inputManager = new InputHandler(this);
        setVisible(true);
    }
    
    public void start(){
        if(!running){
            running = true;
            new Thread(this).start();
        }
    }
    
    public void stop(){
        if(running){
            running = !running;
        }
    }
    
    public Graphics2D getGraphics2D(){
        return g;
    }
    
    public boolean isRunning() {
        return running;
    }

    public long getTicks() {
        return ticks;
    }
    
    public void render(){
        BufferStrategy b = getBufferStrategy();
        if(b == null){
            createBufferStrategy(3);

            return; 
        }
        Graphics g = b.getDrawGraphics();
        g.drawImage(screen, 0, 0, Main.GAME_WIDTH, Main.GAME_HEIGHT, this);
        g.dispose();
        b.show();
    }
    
    public void update(){
        ticks++;
    }
    
    @Override
    public void run() {
        while(running){
            
            update();
            render();
            
        }
    }
    
}

MenuState.java
Java:
package spritesheet;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;


public class MenuState extends State {
	
	int x = 100, y = 100;
    
    public MenuState(){
        super("MenuState");
        inputManager.addMapping("Up", KeyEvent.VK_UP);
        inputManager.addMapping("Down", KeyEvent.VK_DOWN);
        inputManager.addMapping("Left", KeyEvent.VK_LEFT);
        inputManager.addMapping("Right", KeyEvent.VK_RIGHT);
    }
    
    @Override
    public void render(){
        Graphics2D g = getGraphics2D();
        g.setColor(Color.red);
        g.fillRect(x, y, 50, 50);
        g.dispose();
        super.render();

    }
    
    @Override
    public void update(){
    	 super.update();
    	if(inputManager.isPressed("Up"))
    		y--;
    	if(inputManager.isPressed("Down"))
    		y++;
    	if(inputManager.isPressed("Left"))
    		x--;
    	if(inputManager.isPressed("Right"))
    		x++;
       
    }
    
}

StateManager.java
Java:
package spritesheet;

import java.util.ArrayList;
import javax.swing.JFrame;


public class StateManager {
    
    private ArrayList<State> states;
    
    private int currentState;
    
    private JFrame gameFrame;
    
    public StateManager(JFrame j){
        gameFrame = j;
        states = new ArrayList<State>();
        initAllStates();
    }
    
    private void initAllStates(){
        //TODO Add states
        states.add(new MenuState());
    }
    
    public void startCurrentState(){
    	
        states.get(currentState).start();
        gameFrame.add(states.get(currentState));

    }
    
    public void stopCurrentState(){
        gameFrame.remove(states.get(currentState));
        states.get(currentState).stop();
    }
    
    public void setCurrentState(String s){
        for(int i = 0; i < states.size(); i++){
            if(s.equals(states.get(i).name)){
                currentState = i;
            }
        }
    }
    
}

Auf den InputHandler habe ich verzichtet, da er für das Problem unrelevant ist.

Das einzige, was ich anders gemacht habe als im Tutorial ist, dass ich den init(); Aufruf in der Main Klasse ganz oben im Konstruktor habe. Im Tutorial war er ganz unten, dann hat mein Code aber nicht funktioniert. (Wobei ich hier auch nicht weiß warum, da im Tutorial alles geklappt hat)

Ich hoffe mir kann jemand helfen.

Gruß skappler
 

DanZ

Bekanntes Mitglied
An der Position von init() wird es aber vermutlich liegen. Dadurch das init() vor setVisible(true) aufgerufen wird, versucht der State zu zeichnen bevor was zum Zeichnen da ist.
Was heißt denn, dass dein Code nicht funktioniert, wenn init ganz unten aufgerufen wird?
 

skappler

Aktives Mitglied
Als ich die Klassen geschrieben habe hatte ich zum testen ein Rotes Rechteck und einen Text ausgegeben.
Wenn init(); ganz unten stand wurde einfach nichts angezeigt. Der Bildschirm blieb leer.
Das Problem habe ich beseitigt indem ich init(); nach oben geschrieben habe.
Dann habe ich den InputHandler implementiert und den String der gezeichnet wieder entfernt und seitdem kommt dieser Fehler erst überhaupt. Wenn ich jetzt init() wieder nach unten schreibe bleibt der Fehler gleich.
 

DanZ

Bekanntes Mitglied
So weit ich weiß und auch grade nochmal gelesen hab tritt die Exception auf, falls die entsprechende Component keinen sichtbaren Parent hat.

Du könntest also nochmal versuchen das hier so zu machen:

Java:
    public void startCurrentState(){
        gameFrame.add(states.get(currentState));
        states.get(currentState).start();       
 
    }

Damit das Canvas aufjedenfall geaddet ist bevor das Rendering losgeht.
 

skappler

Aktives Mitglied
Ok hab das jetzt geändert. Vielen Dank schonmal.
Wenn ich jetzt init() oben im Konstruktor habe bleibt die Fehlermeldung gleich, wenn init() ganz unten hinschreibe kommt zwar keine Exception, aber der Bildschirm bleibt grau und nichts wird gezeichnet.

EDIT: Ok das hab ich gelöst. ich hab init() direkt unter setVisible(true) geschrieben.
Ein Problem bleibt aber. Der Bildschirm wird nicht neu gezeichnet. Wenn ich die Pfeiltasten drücke werden die Koordinaten zwar korrekt verändert (das habe ich mit System.out gecheckt), aber der Würfel wird nicht neu gezeichnet
 
Zuletzt bearbeitet:

DanZ

Bekanntes Mitglied
Du disposed im render() vom MenuState das Graphics vom BufferedImage und machst es nie wieder auf.
Entweder du lässt es offen oder erstellst es neu. Wie auch immer du vorgehst, du musst auch das Image noch leer machen, sonst bleiben die alten Rechtecke da(sieht aber lustig aus :D )
 

skappler

Aktives Mitglied
Stimmt das dispose hatte ich eingefügt um was zu probieren :p
Das mit dem löschen kommt als nächstes im Tutorial also das passt so^^

Ich hab grad erst mit Grafikprogrammierung angefangen un blick da noch nicht ganz so durch^^

Vielen Dank auf jeden fall für die Hilfe =)

PS: Noch eins: kann ich einstellen, dass das Fenster direkt fokusiert ist, sobald ich das Programm starte? Weil im Moment muss ich immer zuerst in die Zeichenfläche klicken, bevor ich das Rechteck bewegen kann.
 

DanZ

Bekanntes Mitglied
Kein Problem :) Dann einfach viel rumprobieren, dadurch lernt man immer am besten. Das Fenster ist direkt fokussiert denk ich, du musst aber das Canvas/den State fokussieren, weil der InputManager das benutzt.
Die entsprechende Methode heißt requestFocus. Wo du das einbauen musst lass ich dich mal selber ausprobieren ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
R AWT no such child Exception AWT, Swing, JavaFX & SWT 7
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
VfL_Freak AWT Exception in der Eventqueue AWT, Swing, JavaFX & SWT 8
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
I Opencv Imgproc.floodfill exception AWT, Swing, JavaFX & SWT 1
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
T Gui Exception AWT, Swing, JavaFX & SWT 2
X Auf Fensterklasse zugreifen (Nullpointer Exception) AWT, Swing, JavaFX & SWT 2
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
N Swing Exception: Comparison method violates its general contract! AWT, Swing, JavaFX & SWT 13
H Swing Exception's und MVC AWT, Swing, JavaFX & SWT 35
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
K AWT DataBuffer in DataBufferInt Exception AWT, Swing, JavaFX & SWT 2
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
O Immer Exception in AWT-EventQueue-0 AWT, Swing, JavaFX & SWT 5
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
F Swing Seltsame Exception AWT, Swing, JavaFX & SWT 5
R Swing Files auflisten (JButton, JList, Exception) AWT, Swing, JavaFX & SWT 4
V LookAndFeel Nullpoint Exception AWT, Swing, JavaFX & SWT 2
Airwolf89 Swing Exception beim Füllen einer Tabelle AWT, Swing, JavaFX & SWT 10
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
B JTable ValueChanged verursacht Exception AWT, Swing, JavaFX & SWT 3
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
M Exception in eine JTextArea anzeigen AWT, Swing, JavaFX & SWT 7
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
G Kann mir jemand diese Exception erklaeren? AWT, Swing, JavaFX & SWT 8
T AWT Exception AWT, Swing, JavaFX & SWT 5
A Exception beim LineWrapping AWT, Swing, JavaFX & SWT 16
P Für mich unverständliche Exception AWT, Swing, JavaFX & SWT 3
N JList - Nullpointer Exception AWT, Swing, JavaFX & SWT 4
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
T Warum schmeißt das eine Exception? AWT, Swing, JavaFX & SWT 6
I EventDispatchThread Exception AWT, Swing, JavaFX & SWT 5
M Problem: "ArrayIndexOutOfBounds Exception" AWT, Swing, JavaFX & SWT 11
C Out of Bounds Exception, Array of JTextField AWT, Swing, JavaFX & SWT 6
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
D Seltsame AWT-Exception AWT, Swing, JavaFX & SWT 2
M Button und Exception mit NetBeans AWT, Swing, JavaFX & SWT 3
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
M Exception Meldung aus Thread an jTextField1 übergeben AWT, Swing, JavaFX & SWT 6
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
G Drag & Drop bzw. Data Transfer - Exception nach Drag AWT, Swing, JavaFX & SWT 1
K Exception mit "Unknown Source" AWT, Swing, JavaFX & SWT 5
Z jar-File mit SWT - Exception AWT, Swing, JavaFX & SWT 4
F Habe Problem mit dem Abfangen einer Exception AWT, Swing, JavaFX & SWT 10
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
T Programm funkt. nicht - Exception AWT, Swing, JavaFX & SWT 7
A Exception in thread "AWT-EventQueue-0" java.lang.N AWT, Swing, JavaFX & SWT 4
G Exception in JList oder JTextArea AWT, Swing, JavaFX & SWT 9
M java headless exception AWT, Swing, JavaFX & SWT 5
O Exception abfangen AWT, Swing, JavaFX & SWT 19
G Z Buffer / Depth Buffer in Bufferstrategy einfügen AWT, Swing, JavaFX & SWT 1
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
H 2D-Grafik BufferStrategy zieht spur hinter sich her AWT, Swing, JavaFX & SWT 3
M Problem mit bufferstrategy AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
R Verständnisfrage BufferStrategy: g.dispose() AWT, Swing, JavaFX & SWT 3
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
N Performance (BufferStrategy?) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben