Ende eines Frames abwarten

vanBraQ

Mitglied
Hi Leute habe ein Problem ...

Ich habe ein kleines Memory Programmiert welches so aussieht:

Ich habe ein JFrame in dem ich 4*4 Rectangles habe. Außerdem habe ich ein weiteres Rectangle welches ich bewegen kann. Wenn ich nun mit diesem beweglichen Rectangle über das "Spielfeld" fahre und auf eines der anderen Bewege kann ich "Enter" drücken und es öffnet sich quasi die Karte. Das bedeutet es wird ein weiteres JFrame erzeugt.
Unter meinen Karten befinden sich Buchstaben, und so ein Buchstabe wird in dem weitern JFrame welches ich erzeugt habe "vorgefahren", das heißt es bewegt sich ein Rectangle so über das JFrame als würde man den Buchstaben schreiben. Das Rectangle bewegt sich solange ich "Space" drücke. Ist der Buchstabe fertig abgefahren, schließt sich das zweite JFrame und ich kann erneut am ersten JFrame weiter arbeiten.

Nun habe ich aber das Problem, dass ich quasi beim Karten öffnen mehr ausführe als nur das simple JFrame zu erzeugen. Hierfür habe ich die Methode openCard():
Java:
public void openCard(int height, int width) {
		String letter = playfield[height][width];
		new PrintField(letter, this);
		setCards(letter);
		sf.setKarte(letter);
		printPlayerCards();
	}
Mit new PrintField(letter, this) erzeuge ich das zweite JFrame, ich will aber, dass setCards usw. erst ausgeführt wird, wenn der Buchstabe fertig "vorgefahren" wurde, und sich das Frame automatisch geschlossen hat.
Meine Idee, ich baue mir eine while-Schleife ein, und frage irgendeinen Boolean ab, ca so:
Java:
public void openCard(int height, int width) {
		String letter = playfield[height][width];
		new PrintField(letter, this);
		while(this.letterFertigGezeichnet == false){
			System.out.println("Ich warte bis er fertig gezeichnet ist");
		}
		setCards(letter);
		sf.setKarte(letter);
		printPlayerCards();
	}

Das Problem hier: Mein JFrame ladet nicht erfolgreich und ich kann dass "Vorfahren" gar nicht starten.

Wie kann ich das Problem lösen ? Oder muss ich meinen kompletten Code umstrukturieren?
 
naja das Problem ist wohl ein anderes ...

habe als zentrale Steuerklasse die Klasse Game, von dort aus werden die ganzen JFrames aufgerufen und in ihr läuft auch die gesamte Logik ab. Diese Klasse muss quasi gesperrt werden während das bestimmte JFrame gerade ausgeführt wird.
 
naja das Problem ist wohl ein anderes ...
habe als zentrale Steuerklasse die Klasse Game, von dort aus werden die ganzen JFrames aufgerufen und in ihr läuft auch die gesamte Logik ab. Diese Klasse muss quasi gesperrt werden während das bestimmte JFrame gerade ausgeführt wird.
Aha. Ich habe leider keine Ahnung, wie man "eine Klasse sperrt", auch nicht "quasi", dafür habe ich den Eindruck, daß einer von uns beiden nicht ganz verstanden hat, wo das eigentliche Problem liegt.
Dann nochmal langsam. Wir reden von einer single threaded Applikation. Du hast eine openCard-Methode, die einen JFrame auf den Bildschirm bringt. Du möchtest, daß die Ausführung der Methode stoppt, solange der JFrame sichtbar ist, und erst dann weiter läuft und die Methode setCards() aufruft, wenn der JFrame verschwunden ist/vernichtet wurde.
Ist das das "Problem"? Wenn ja, musst du wie oben beschrieben den JFrame durch einen modalen JDialog ersetzen.
 
was Harry Kane als Lösung vorschlägt ist der richtige Ansatz

hier mal als kleines Beispiel wie sowas funktioniert:

Java:
package ModalDialogs;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ModalDialogsDemo extends JFrame
{
	public static void main(String[] args)
	{
		new ModalDialogsDemo();
	}
	
	public ModalDialogsDemo()
	{
		this.setSize(300,100);
		this.getContentPane().setLayout(new BorderLayout());
		
		JButton openModalBtn = new JButton("Zeige ersten Dialog (Modal)");
		openModalBtn.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				openDialogFirst();
			}
		});
		this.add(openModalBtn, BorderLayout.NORTH);
		
		JButton openNotModalBtn = new JButton("Zeige zweiten Dialog (nicht Modal)");
		openNotModalBtn.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				openDialogSecond();
			}
		});
		this.add(openNotModalBtn, BorderLayout.SOUTH);
		
		this.setVisible(true);
	}
	
	private void openDialogFirst()
	{
		// wichtig: modale dialoge brauchen immer einen "parent", damit Sie diesen sperren können
		JDialog firstDialog = new JDialog(this, "First Dialog");
		firstDialog.setSize(800,200);
		firstDialog.add(new JLabel("Solange dieser Dialog offen ist, kann im anderen Dialog nichts gemacht werden"));
		// wichtig: modale dialoge müssen vor "setVisible" auf modal gestellt werden
		firstDialog.setModal(true);
		// hinweis: diese zeile lässt dein programm warten, bis der dialog wieder geschlossen wurde
		firstDialog.setVisible(true);
		// ... hier gehts weiter wenn der modale dialog geschlossen wurde
	}
	
	private void openDialogSecond()
	{
		JDialog secondDialog = new JDialog(this, "Second Dialog");
		secondDialog.setSize(800,200);
		secondDialog.add(new JLabel("Dieser Dialog ist nicht Modal, also kann man im Hauptfenster noch dinge tun"));
		secondDialog.setVisible(true);
	}
}
 
Meine Basis Klasse ist kein JFrame sondern eine normale Klasse kann es sein, dass es dadurch nicht funktioniert?

Wenn ihr wollt kann ich euch auch den Link zum Git-Repo geben, dann könnt ihr es euch ganz ansehen
 
Meine Basis Klasse ist kein JFrame sondern eine normale Klasse kann es sein, dass es dadurch nicht funktioniert?

Wenn ihr wollt kann ich euch auch den Link zum Git-Repo geben, dann könnt ihr es euch ganz ansehen

kann sein, kann nicht sein, ich frage mal die USB 4.0 Glaskugel... jap
generell hilfreicher hinweis: weniger vermuten, mehr wissen

damit wir dir helfen können brauchen wir mehr infos, ich kann dir durch raten alleine ned helfen
 
Was du als Basisklase verwendest, ist zweitrangig.
Der Punkt ist folgender: In deiner openCard-Methode steht die Zeile
Code:
new PrintField(letter, this);
Damit bringst du offenbar einen JFrame auf den Bildschirm. Die Klasse PrintField erweitert also JFrame oder erzeugt in ihrem Kontruktor eine Instanz von JFrame und zeigt diese an.
Was auch immer von beidem der Fall sein mag: Du musst JFrame durch JDialog ersetzen.
 

Neue Themen


Zurück
Oben