Wie entferne ich ein JPanel von einen JFrame bei einen 2D Tile Spiel (Java)?
Hallo.
Ich werde hier nicht den ganzen Code posten da das ganze zu kompliziert ist, sondern ich werde versuchen es grob zu erklären.
Ich arbeite gerade an einen Spiel das aus 2D tiles gebaut ist.
Das Spiel hat folgende Klassen (die hier relevante sind):
MainClass: Die Hauptklasse wo der Code beginnt. Hier wird das JFrame erstellt, initialisiert usw.
GameField: Hier findet das Spiel statt. Der Charakter bewegt sich hier wie bei den alten NES Legend of Zelda Spiel. Hier befindet sich auch die Thread Methode mit dem Namen Run(). Hier ist auch eine Update() und Redraw() Methode, die je die Spieldaten aktuelisieren und die aktuelisieren Daten dann auf das GameField anzeigen. Das ganze passiert 60 mal die Sekunde.
Player: In dieser Klasse wird der Soieler eingestellt.
Jetzt zu den Problem.
Ich will dass, nachdem der Spieler eine bestimmte Anzahl an Gegenständen in den Feld gesammelt hat dass das GameField aus den JFrame weggemacht wird mit frame.remove(GameField); und dass es mit anderen JPanels ausgetauscht wird die das Ende der Geschichte des Spiels anzeigen.
Ich habe die ganze Logik für den Spieler, wie er sich bewegt, wie er Sachen aufsammelt (dies wird in der Player Klasse geregelt) etc. Was ich will, ist lediglich zu wissen wie das GameField aus dem JFrame weggemacht wird, was mir bisher nicht gelungen ist.
Danke im voraus.
1 Antwort
Mit der remove-Methode kannst du Komponenten von einem Container entfernen. Danach muss allerdings die Oberfläche neugezeichnet werden. Mit dem Aufruf von revalidate gibst du an, das die Hierarchie des Frame nicht mehr valid ist und daher neugebaut werden muss.
frame.remove(yourPanel);
frame.revalidate();
frame.repaint();
Wenn du ein neues Panel hineinhängen möchtest, mach das noch vor dem revalidate-Aufruf.
(...) die das Ende der Geschichte des Spiels anzeigen.
Man könnte auch einfach die Zeichenfläche des Panels überzeichnen / überdecken. So müsste das Fenster nicht neu gezeichnet werden.
Ein CardLayout zu verwenden, könnte ebenso eine Lösungsoption sein.
Ich kann das jedoch nicht einfach in der MainClass machen, da wenn das GameField gestartet wird, geht es da nicht mehr so leicht raus.