Verwirrung mit AWT Frame und main Methode

Pincalibur

Mitglied
Hi liebes Forum,

ich versuche eine Spiele Engine für Java zu schreiben.
Dabei möchte ich die Spielszenenverwaltung mit meiner abstrakten Klasse scene lösen.
Erbende Klassen müssen die Methode update implementieren, die bei jedem Durchlauf ausgeführt werden soll.
Dazu gibt es eine Klasse die Global heißt. Sie verwaltet öffentliche Variabeln wie zB Global.scene.
In ihr steht die aktuelle Instanz von den Scene Klassen, die geupdatet wird.
Wird Global.scene auf null gesetzt, soll das Spiel beendet werden.
Funktioniert eigentlich gut, nur wenn ich dann einen AWT Frame einbaue laufe ich auf einen verwirrenden Umstand:
Er durchläuft die Hauptschleife nicht mehr. Gar nicht mehr. :/
Setze ich im Code des AWT Frames Global.scene auf null, reagiert die main Methode nicht mehr drauf.

Hier der src Code:

Java:
public abstract class Main {

	public static void main(final String[] args)
    {
		System.out.print("Starting...\n");
		initiateConfig();
		Global.window.show(true);
		while(true){
			if(Global.scene == null){
				break;
			}
			else
				Global.scene.update();
		}
		System.out.print("Closed.\n");
    }
	
	public static void initiateConfig(){
		//Fenster mit Fenstergröße
		Global.window = new Window(new Size(1280, 800));
		//Startszene
		Global.scene = new Scene_Title();
		//Default Sprache
		Global.language = new Lang_deDE();
	}
	
}

Java:
public class Window extends Canvas {
	
	// Attributes
	private Frame frame;
	private Size size;
	private ArrayList<ImageContainer> imgList;
	
	// Gets & Sets
	public void setImageList(ArrayList<ImageContainer> imageList){
		this.imgList = imageList;
	}
	
	// Constructors
	public Window(){
		init();
	}
	public Window(Size size){
		this.size = size;
		init();
	}
	
	// Methodes
	private void init(){
		frame =   new Frame( "Das Fenster zur Welt" );
		frame.setSize  ( size.getX(), size.getY() );
		frame.addWindowListener(new WindowAdapter() {
	         public void windowClosing(WindowEvent e) {
	        	 Global.scene = null;
	             Global.window.frame.dispose();
	         }
	      });
		System.out.print("Title Screen displays.\nWelcome to the Game.\n");	
	}
	
	public void show(boolean value){
		frame.setVisible  ( value );
	}
	
	public void paint(Graphics g) {
		for(ImageContainer img :imgList)
			g.drawImage(img.getImage(),img.getPosition().getX(),img.getPosition().getY(),this);	
		
	}
}

Java:
public abstract class Scene {
	
	// Attributes
	public int graphic_alpha;
	protected ArrayList<ImageContainer> imgList = new ArrayList<ImageContainer>() ;
	
	//Methods
	public void routine(){
		update();
		draw();
	}
	public abstract void init();
	public abstract void update();
	public abstract void draw();
	protected void addImage(ImageContainer img){
		imgList.add(img);
		Collections.sort(imgList);
	}
	protected ImageContainer getImage(int id){
		return imgList.get(id);
	}
}

Ich hoffe mir kann geholfen werden, warum meine Schleife in main nur durchlaufen wird, wenn ich hinterher nen Debugpunkt drauf mache.
 

Bile Demon

Bekanntes Mitglied
Java:
while(true){
        if(Global.scene == null){
            break;
        }
        else
            Global.scene.update();
}

Witzige Idee, die Schleifenbedingung aus dem Schleifenkopf rauszunehmen und dir eine sinnlose Endlosschleife zu basteln.

Wie wärs stattdessen mit

Java:
while(Global.scene != null)
    Global.scene.update();

Zu deinem Problem kann ich leider nichts sagen. Wie kommst du darauf, dass die Schleife nicht mehr durchlaufen wird?
 

Pincalibur

Mitglied
Diese While Konstruktion hatte ich vorher auch. Hab sie wegen meines Problems raus genommen um diese Überprüfung besser Debuggen zu können. Eine Endlosschleife ist das nicht.

Zu meinem eigentlichen Problem:
Schließe ich das Frame über den X-Button (Global.scene = null), so wird das Programm nicht beendet, sondern ich sehe im Debugmodus von Eclipse, dass die Java VM noch läuft.
Erst wenn ich einen Breakpoint auf die if-Abfrage in der "Endlosschleife" mache, wird dieser aktiv, läuft die if durch und landet (weil Global.scene == null -> true ergibt) im break.
Er sollte ja eigentlich schon drin landen, bevor ich den Breakpoint setze... Das verwirrt mich.

Edit2: Meine Endlosschleife hab ich auch primär deshalb so gebaut, weil ich beim debuggen sonst direkt auf der Anweisung lande und er OBWOHL Global.scene = null ist, die Schleife weiter ausführt und damit natürlich keine Objektreferenz mehr hat und eine Exception wirft.
Es ist als ob er sie pausiert, wenn das AWT Frame aktiv ist.
Baue ich print anweisungen in das update, sehe ich jedoch, dass sich dort was tut.
 
Zuletzt bearbeitet:

Pincalibur

Mitglied
Aktuell macht update nichts.
Dort sollen später die inputs von Tastatur & co und alle Berechnungen rein.

Edit: Danke, dass Canvas wurde noch nicht geaddet. Kein Wunder dass ich noch keine Bilder sehen konnte. Das löst zumindest schon mal ein Problem in der Zukunft ;)
 
Zuletzt bearbeitet:

Bile Demon

Bekanntes Mitglied
Eine Endlosschleife ist das nicht.

[OT]Keine "echte" jedenfalls, aber zumindest eine unechte ;)

Ich zitiere dazu mal die Wikipedia:

"Der einfachste Fall einer Endlosschleife wird solange ausgeführt, wie 'true' wahr ist – also für immer. (Es sei denn, es befinden sich innerhalb der Schleife eine oder mehrere break-Anweisungen, dann ist es keine „echte“ Endlosschleife.)"[/OT]
 

Pincalibur

Mitglied
Ich habe gerade eine print Anweisung("Running...") in meine update Methode geschrieben und voila. Das Programm beendet sich, wenn Global.scene = null ist.
Wunderlicherweise funktioniert das Ganze nicht mehr, wenn ich einfache Rechenanweisungen(int i = 2; int j = i*2; etc) reinschreibe.

Was ist ein KSKB?
Ich würde auch das Projekt selbst hochladen, hab ich erst gestern angefangen, daher ist es nicht sehr groß.
 

Pincalibur

Mitglied
Darum ging es mir auch noch nicht.
Es geht um das Schließen des Frames, die Anwendung gibt der Konsole das "Closed." nicht aus.
-> Die Anwendung läuft noch.

Edit:
Die Bildanzeige funktioniert jetzt ohne Probleme. Das hält mich auch grad nicht auf.
 
Zuletzt bearbeitet:

Bile Demon

Bekanntes Mitglied
Bei Nebenläufigkeit solltest du beachten, dass Global.scene ja genau in DEM Augenblick auf null gesetzt werden könnte, wo der Test auf null gerade passiert war -> Global.scene.update() -> NPE
 

Bile Demon

Bekanntes Mitglied
Nein, das ist keine Problemlösung, das ist Unterdrückung der Symptome.
Problemlösung wäre z.B. solche Zugriffe richtig zu synchronisieren.

Allerdings ist ja noch nicht gesagt, wo genau die NPE auftritt.
 

kaetzacoatl

Bekanntes Mitglied
ich würde den Zugriff
sychronized machen,
mit Thread.sleep()
etwas zeit für das
Window machen.
update würde ich dann
ziemlich kurz machen
um den EDT nicht zu
blockieren.

Oder eine bessere Idee:
die Scene nicht auf null
setzen sondern eine
boolean-Variable anlegen.

Oder noch besser die
Scene speichern.
 

Pincalibur

Mitglied
Ich glaub ich lass das AWT Frame beim close Button einfach die System.exit machen, dann hab ich kein Problem mit der Synchronisation...^^'

Edit: Ausprobiert. Klappt wunderbar. Auch wenn mich interessieren würde, warum ich bei der Ausführung nicht auf die NPE treffe..
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Verwirrung bei Streams aus primitiven Arrays Java Basics - Anfänger-Themen 2
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J Array verwirrung ! Java Basics - Anfänger-Themen 21
S Verwirrung - Dynamische Bindung greift nicht Java Basics - Anfänger-Themen 2
B Classpath static block - Verwirrung Java Basics - Anfänger-Themen 2
B Erste Schritte Verwirrung in der Namensgebung Java Basics - Anfänger-Themen 9
T java Verwirrung Java Basics - Anfänger-Themen 21
G Verwirrung bei abstrakter Klasse/Methode Java Basics - Anfänger-Themen 4
Alex_99 Aktion ausführen wenn Frame disposed wurde Java Basics - Anfänger-Themen 5
frager2345 Fensterklasse, Wie auf Frame im Listender zugreifen (ItemEvents) Java Basics - Anfänger-Themen 7
S GUI Frame wechseln Java Basics - Anfänger-Themen 15
C Exportierte JAR öffnet zweiten Frame nicht mehr Java Basics - Anfänger-Themen 7
C Erkennen ob Frame geschlossen wurde Java Basics - Anfänger-Themen 2
C Erste Schritte Spieler an anderen Frame weitergeben Java Basics - Anfänger-Themen 23
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
M Erste Schritte Neuen Frame nur einmal offen haben Java Basics - Anfänger-Themen 6
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
R Erste Schritte Frame mit Ladebalken und BestätigungsButton Java Basics - Anfänger-Themen 10
das_leon Interface Frame in einem Frame (Window Builder) Java Basics - Anfänger-Themen 2
Anfänger2011 Frame zeigt nicht gewünschtes Ergebnis an ... Java Basics - Anfänger-Themen 5
Z Object Kreis am Frame abprallen lassen! Java Basics - Anfänger-Themen 12
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
I Methoden Schwierikeiten mit Protokollfenster (Frame Objekt) Java Basics - Anfänger-Themen 4
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
J Extra Fenster (Frame) Java Basics - Anfänger-Themen 20
W Frame in anderer Klasse anzeigen lassen Java Basics - Anfänger-Themen 1
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
R File chooser Dateien in frame anzeigen lassen Java Basics - Anfänger-Themen 5
L bestimmten Frame anzeigen lassen? Java Basics - Anfänger-Themen 6
H Textfeldinhalt löschen nachdem Frame geschlossen wird Java Basics - Anfänger-Themen 8
L Kalender Java Frame Java Basics - Anfänger-Themen 7
A Frame Java Basics - Anfänger-Themen 3
A Frame java Java Basics - Anfänger-Themen 3
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
T udp -> bytearray -> image -> ausgabe via frame Java Basics - Anfänger-Themen 6
J Erste Schritte Speichern / Speichern unter / title Frame Java Basics - Anfänger-Themen 5
F Frame in Frame Java Basics - Anfänger-Themen 3
U GUI - resize frame Java Basics - Anfänger-Themen 13
J Open reading Frame Java Basics - Anfänger-Themen 4
J Erstelltes Frame wird nicht angezeigt Java Basics - Anfänger-Themen 2
K Frame öffnen klappt nicht?! Java Basics - Anfänger-Themen 36
JAVAnnik Anwendung nach Schließen vom letzen Frame Java Basics - Anfänger-Themen 9
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
A Frame Background Java Basics - Anfänger-Themen 21
S Klassen Klassenname = Frame? Java Basics - Anfänger-Themen 11
R Eingefärbtes Panel wird in Frame nicht angezeigt Java Basics - Anfänger-Themen 10
I Java - Text in neuem Frame wird nicht angezeigt Java Basics - Anfänger-Themen 4
M Frame mit mehreren areas Java Basics - Anfänger-Themen 14
B Frame über Button öffnen Java Basics - Anfänger-Themen 8
R Button soll neuen Frame öffnen Java Basics - Anfänger-Themen 21
L Variablen Frame Variablen-Schleife Java Basics - Anfänger-Themen 3
D Neues Frame öffnen Java Basics - Anfänger-Themen 7
V Frame bleibt grau Java Basics - Anfänger-Themen 5
G Polygon in Frame zeichnen Java Basics - Anfänger-Themen 3
F frame wird nicht angezeigt? Java Basics - Anfänger-Themen 10
S 2 Panels in einen Frame Java Basics - Anfänger-Themen 5
H Panels in Frame einbinden Java Basics - Anfänger-Themen 3
E Frame neu Zeichnen Java Basics - Anfänger-Themen 3
A Bild wird auf Frame nicht angezeigt! Keine Fehlermeldung Java Basics - Anfänger-Themen 3
O Grafik in Frame laden Java Basics - Anfänger-Themen 9
T Frame öffnen Java Basics - Anfänger-Themen 6
I 1 Frame und mehrere Panels klappt nicht Java Basics - Anfänger-Themen 4
I JTable in bestehenden Frame integrieren Java Basics - Anfänger-Themen 6
Y Hilfe: JOGL / OPENGL in Frame Java Basics - Anfänger-Themen 2
J Frame schließen, Ereignis behandeln, Vorgang abbrechen Java Basics - Anfänger-Themen 4
Luk10 Frame schließen Java Basics - Anfänger-Themen 2
A Frame schließen!? Help! Java Basics - Anfänger-Themen 5
A Frame reagiert nicht Java Basics - Anfänger-Themen 6
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
J Frame bleibt schwarz beim Laden Java Basics - Anfänger-Themen 11
ModellbahnerTT Unterschied zwischen zwei Frame close Varianten Java Basics - Anfänger-Themen 3
R Frame Inhalt ausrichten Java Basics - Anfänger-Themen 5
MisterSeven Java Swing - Wie Frame größe festlegen?! Java Basics - Anfänger-Themen 10
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Stillmatic1985 Label in einem Frame zentrieren Java Basics - Anfänger-Themen 4
A Grafik erstellen und in Frame einfügen Java Basics - Anfänger-Themen 17
A Java Frame per X schließen? Java Basics - Anfänger-Themen 7
H2SO3- image beim awt frame wegmachen Java Basics - Anfänger-Themen 2
kulturfenster Panel in Frame integrieren Java Basics - Anfänger-Themen 5
kulturfenster Per Button Frame schliessen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
I JButton zum frame schließen Java Basics - Anfänger-Themen 6
M Variable in Frame anzeigen Java Basics - Anfänger-Themen 11
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
hdi Desktop-Auflösung abfragen -> setLocation() von Frame Java Basics - Anfänger-Themen 5
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
S Übergabe von Frame-Objekt - kritisch? Java Basics - Anfänger-Themen 7
N Frame in Frame erstellen Java Basics - Anfänger-Themen 2
B Java-Frame Taschenrechner - String -> Int und umgekehrt Java Basics - Anfänger-Themen 8
G Bild wird im falschen Frame angezeigt Java Basics - Anfänger-Themen 5
G Frame soll Focus behalten Java Basics - Anfänger-Themen 2
H Frame schließen Java Basics - Anfänger-Themen 5
G Frame Applet oder doch was anderes Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben