JFrame sicher öffnen

Samuel72

Aktives Mitglied
Hallo zusammen,

ich habe ein sehr merkwürdiges Problem
(in einem Spiel, welches so umfangreich ist, dass ich kaum Code posten kann).

Hierbei soll von einem JFrameA (Spielsteuerung) aus ein JFrameB (das Spiel) gestartet werden.

Folgendes Phänomen:

Code von dieser Art im Construktor von JFrameA bewirkt korrektes Öffnen von JFrameB:

Java:
new JFrameB();

Hingegen bewirkt der folgende Code, dass zwar ein bisschen vom JFrameB angezeigt wird, aber die Anwendung sich danach aufhängt: Der JFrameB reagiert auch nicht auf den Minimieren-Button...

Java:
SwingUtilities.invokeLater(new Runnable() {
   public void run() {
      new JFrameB();
   }
});
Leider hängt er sich auch auf, wenn ich auf andere Weise den JFrameB aufrufe (also etwa durch Drücken eines "Start"-Buttons).

Wie gesagt, das ganze kommt mir sehr merkwürdig vor. Wahrscheinlich habe ich einfach unsauber programmiert und jetzt sitzt irgendwo in den Tiefen meines Codes der Wurm.

Aber vielleicht gibt es ja eine Methode, die ich nicht kenne, einen JFrame sicher zu öffnen, die dann (zufällig) auch mein Problem löst.
 
Nein, aufjedenfall nicht auf der Basis des "Codes" den du gepostet hast... wenn in der IDE Fehlermeldungen kommen, poste die mal bitte
 
Danke für die Antworten.

Fehlermeldung gibt es leider keine - er hängt sich einfach auf.

Den Vorschlag mit dem CardLayout finde ich gut - schaut wahrscheinlich besser aus,
und ich habe ein konkretes Ziel, auf dashin ich einen Haufen Code in die Hand nehmen muss,
vielleicht taucht dabei ja der Fehler auf.

Es kann ein bisschen dauern, bis ich dazu komme; ich werde dann vom Erfolg berichten.
 
Jetzt hab ich das Problem behoben (zumindest weitgehend).

Das CardLayout hat zwar das ganze verschönert, aber das Problem blieb das gleiche. (Trotzdem danke!)

Das Problem bestand wohl darin, dass die Komponenten nicht fertig gezeichnet waren, als die erste Benutzereingabe verlangt wurde, wodurch sich das Programm aufgehängt hat.

Ich habe nun das Zeichnen in einen Thread verlegt - dann wird anscheinend sofort gezeichnet; jedenfalls funktioniert es jetzt.

(Trotzdem merkwürdig.)
 
Das Problem bestand wohl darin, dass die Komponenten nicht fertig gezeichnet waren, als die erste Benutzereingabe verlangt wurde, wodurch sich das Programm aufgehängt hat.

Ich habe nun das Zeichnen in einen Thread verlegt - dann wird anscheinend sofort gezeichnet; jedenfalls funktioniert es jetzt.

Da würde mich der vorherige Code, sowie der neue, dann aber schon interessieren!
 
Hallo GUI-Programmer,

hier nun endlich etwas Code:
Java:
public class Spiel implements Runnable {

...

	public Spiel(SpielSteuerung st) { // normales Spiel
		steuerung = st;
		new Thread(this).start();
	}

...

	public void run() {
		karten = steuerung.waehler.getAuswahl();
		muell = new Stapel(this,null);
		selectStapel = new Stapel(this,null);
		kaufstapel = new Kaufstapel(this, karten);

		graphik = steuerung.steuerFrame.spielPanel;
		((MainFrame)graphik).setKarten(this);

		LinkedList<SpielerDaten> spdl = new SpielerWaehler(karten, steuerung.gegner+1).getBest();
		spdl.addFirst(new SpielerDaten(steuerung.name, null));

		spieler = new LinkedList<Spieler>();
		for (SpielerDaten spd:spdl) {
			if (spd.praeferenz==null)
				spieler.add(new MenschSpieler(this, spd.name));
			else
				spieler.add(new ComputerSpieler(this, spd, karten));
		}
		control = new Selector((MainFrame)graphik, spieler.get(0));
		((MainFrame)graphik).setSpielerPanels();
		spiele();
	}
}
Vorher war der Code, der jetzt in der Methode run() steht, im Constructor.

Vermutlich nicht sehr erhellend - aber du wirst ja kaum von mir verlangen, dass ich hier alle 150 Klassen poste.
Wie gesagt: Ich vermute, dass es deshalb klappt, weil der Thread eher zeichnet.
 
Vermutlich nicht sehr erhellend - aber du wirst ja kaum von mir verlangen, dass ich hier alle 150 Klassen poste.
Wie gesagt: Ich vermute, dass es deshalb klappt, weil der Thread eher zeichnet.

Autsch, da tut mein MVC Herz aber weh! 150 Klassen und dann so einen Umgang mit dem Zeichnen!

Ganz im Ernst, bei so einem Fall lässt sich wirklich nicht viel darüber sagen, woran es liegt, wenn was nicht gezeichnet wird. Aber ich vermute, dass du evtl. sogar indirekt mit deiner Vermutung Recht haben könntest.
 
Autsch, da tut mein MVC Herz aber weh! 150 Klassen und dann so einen Umgang mit dem Zeichnen!
Ich bin halt ein ziemlicher Autodidakt. Dabei habe ich mich dem MVC-Pattern sogar etwas angenähert, indem ich im späteren Spielverlauf alle Graphikausgaben über ein Interface laufen lassen.
In meinem Fall hat das (neben dem weniger hässlichen und fehlerträchtigen Code) noch den Sinn, dass ich das Graphik-Interface zweimal implementiere: Einmal durch die normale Graphikausgabe und einmal durch eine Leer-Graphik, die gar nichts macht - so kann der Computer das Spiel ein paarmal durchspielen, um seine beste Strategie herauszufinden.
 

Zurück
Oben