BufferStragety Fehler: Component must have a valid peer

Status
Nicht offen für weitere Antworten.

Revenant

Aktives Mitglied
Hi,

bräuchte mal wieder Hilfe... ich will ne einfache BufferStrategy verwenden, scheitere jedoch aufgrund eines mir unbekannten Fehlers. Der Code ist echt klein, ich frag mich was schief geht?

Exception in thread "main" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3362)
at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3337)
at java.awt.Component.createBufferStrategy(Component.java:3246)
at java.awt.Canvas.createBufferStrategy(Canvas.java:166)
at java.awt.Component.createBufferStrategy(Component.java:3178)
at java.awt.Canvas.createBufferStrategy(Canvas.java:141)
at GameCanvas.<init>(GameCanvas.java:23)
at LevelControl.<init>(LevelControl.java:20)
at Ships3.main(Ships3.java:8)


Code:
public class GameCanvas extends Canvas
{
    private BufferStrategy strategy;
    private Graphics2D g;
    
    /**creates the canvas and the used BufferStrategy
    GameCanvas()
    {
        // size of canvas
        this.setBounds(0,0,800,600);
        this.setBackground(Color.BLACK);
        // active rendering
        this.setIgnoreRepaint(true);
        // BufferStrategy
        createBufferStrategy(2);
        strategy = getBufferStrategy();
    }
    
    /**returns the (by the canvas accelerated) graphics context to which all other classes should draw to
    public Graphics2D getGraphicsContext()
    {
        return g = (Graphics2D) strategy.getDrawGraphics();
    }
    
    /**draws the accelerated canvas, note: this method should be called after all the other classes finished drawing
    public void draw()
    {
        // finally, we've completed drawing so clear up the graphics
        // and flip the buffer over
        g.dispose();
        strategy.show();
    }
}
 

Wildcard

Top Contributor
Bin mir jetzt nicht 100% sicher, aber soweit ich weiß müsste vorher addNotify() aufgerufen werden.
Das solltest du jedoch nicht selbst tun sondern von AWT erledigen lassen.
Dazu muss die Canvas einen Parent erhalten und dieser Parent sichtbar gemacht werden.
 

Revenant

Aktives Mitglied
yo, das hab ich beim googeln auch gefunden. Meine Spiellogik versucht das auch:

Code:
public class LevelControl extends Thread
{
    GameCanvas canvas;
    
    public LevelControl()
    {
        // create main frame/panel/canvas
        JFrame frame = new JFrame("Ships3");
        frame.setPreferredSize(new Dimension(800,600));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.pack();
        frame.setResizable(false);
        // make stuff visible
        frame.setVisible(true);
        
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800,600));
        panel.setLayout(null);
        canvas = new GameCanvas();
        panel.add(canvas);       
        frame.add(panel);
    }
    
    /**THE GAME LOOP
    public void run()
    {
        canvas.getGraphicsContext();
    }
}

Edit: is das nicht irgendwie unschön? Erst das Frame sichtbar machen und dann noch was hinzufügen?
 

Chris_1980

Bekanntes Mitglied
Du darfst createBufferStrategy() nicht im Constructor aufrufen.
Zum Zeitpunkt des Constructoraufrufs ist das Canvas logischerweise niemals Sichtbar.
Schreib das gesondert in ne Methode, die du aufrufst, nachdem du dein Canvas auf den Frame geadded hast und dieser sichtbar ist.
 

Revenant

Aktives Mitglied
Ok, so funktioniert es, vielen Dank.

Ist es legitim das createBufferStragety() in der canvas.getGraphicsContext() aufzurufen? Denn das würde dann ja bei jedem Threaddurchlauf passieren (Performance).
 

Chris_1980

Bekanntes Mitglied
Also die BufferStrategy muß nur einmal erstellt werden. Ich seh da keinen Grund das bei jedem Durchlauf zu tuen, aber wie sich das auswirkt weiß ich nicht.

mach doch einfach eine Methode
Code:
public void createStrategy()
{
    createBufferStrategy(2);
    strategy = getBufferStrategy();
}

Und die rufst du dann einmal nachdem du frame.setVisible(true) gemacht hast auf.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Zeiterfassungsprogramm Fehler Spiele- und Multimedia-Programmierung 7
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
M Fehler bei MinecraftPlugin Spiele- und Multimedia-Programmierung 3
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
coolian glsl shader syntax fehler bei if? Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
D Fehler bei GUI-Aktualisierung Spiele- und Multimedia-Programmierung 9
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
2 jMonkey fehler Spiele- und Multimedia-Programmierung 0
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
A Minecraft Plugin Teleport Fehler Spiele- und Multimedia-Programmierung 1
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
CookieSoft Slick Texture laden Fehler Spiele- und Multimedia-Programmierung 6
A Netbeans / Gamegrid Fehler/Maze Spiele- und Multimedia-Programmierung 2
1 Fehler bei Krümel&Monster Spiele- und Multimedia-Programmierung 16
0 Finde den Fehler nicht Spiele- und Multimedia-Programmierung 2
C Java Fehler (If?) Spiele- und Multimedia-Programmierung 14
F fehler Spiele- und Multimedia-Programmierung 2
L Abfrage-Fehler? - Hilfe bei Tetris Spiele- und Multimedia-Programmierung 9
N bei abspielen der wav datei fehler Spiele- und Multimedia-Programmierung 6
D Java 2d translation() fehler Spiele- und Multimedia-Programmierung 4
D Fehler beim Stein Scher papier Spiel Spiele- und Multimedia-Programmierung 3
G Schüsse zeichnen, Fehler? Spiele- und Multimedia-Programmierung 3
S drawImage Fehler ! Spiele- und Multimedia-Programmierung 3
V Minesweeperprogrammierung Fehler J0098 Spiele- und Multimedia-Programmierung 8
I Fehler bei Änderung der Bildschirmauflösung Spiele- und Multimedia-Programmierung 3
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
F Swing Component draggen Spiele- und Multimedia-Programmierung 25

Ähnliche Java Themen

Neue Themen


Oben