Swing Konstruktor wird nicht rechtzeitig fertig?

SimProtect

Aktives Mitglied
Hallo Leute,

Ich habe nochmal ein kurzes Problem: Ich habe einen WindowAdapter implementiert, welcher WindowClosing abfängt. Anstatt des Close-Vorganges soll ein Popup erscheinen, welches fragt, ob man das Programm tatsächlich beenden möchte und ob man es ohne zu speichern beenden möchte.

Es ist also ein simpler JFrame mit einem Title und drei Buttons ("Save", "Exit", "Cancel").

Im entsprechenden Listener wird folgender Code ausgeführt:

Code:
		ApplicationEndPopup popup = new ApplicationEndPopup(related);
		popup.displayPopup();
		while(waitingForPopup){
			waitingForPopup = !popup.getDone();
		}

Nun wird der Popup-Frame partiell aufgebaut. Title ist gesetzt, Größe ist festgelegt, aber die Buttons ihrerseits sind noch nicht hinzugefügt. Zu diesem Zeitpunkt hängt das Programm bereits in der While-Schleife fest.

Setze ich zwischen den Konstruktor-Aufruf und die display()-Anweisung ein wait(), fliegt mir zwar eine Exception um die Ohren (diejenige, die man auch gezwungen wird, abzufangen), aber der Frame wird korrekt aufgebaut.

Nun bin ich auf ein solches Problem noch nie gestoßen (zumindest nicht in Java). Ist es tatsächlich möglich, dass der Konstruktor-Call noch nicht vollständig abgearbeitet worden ist und schon die nächste Methode getriggert wird?
 
Du weißt das Swing Singel Thread ist. Es gibt nur einen Thread und das ist der EventDispatcherThread. Das heißt hier kann nix parallel ausgeführt werden. Außer dein Main Thread macht noch was ?

Edit:

Ah jetzt sehe ich was du machst. Du willst das deine Methode Blockiert bis das Popup geschlossen wird. Aber das Blockiert den EventDispatcherThread und deswegen werden deine Buttons nicht gezeichnet. Schau mal nach einem Modalen Dialog oder nutze doch einfach JOptionPane?

Java:
//Custom button text
Object[] options = {"Yes, please",
                    "No, thanks",
                    "No eggs, no ham!"};
int n = JOptionPane.showOptionDialog(frame,
    "Would you like some green eggs to go "
    + "with that ham?",
    "A Silly Question",
    JOptionPane.YES_NO_CANCEL_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,
    options[2]);
 
Zuletzt bearbeitet:
Also im Prinzip handelt es sich um eine zu diesem Zeitpunkt untätige Applikation (selbst ein JFrame). Auf diesem Frame ist besagter Listener (WindowAdapter) registriert (als einziger Listener), der ausschließlich die Methode WindowsClosing überschreibt (oben gezeigter Code).

Es wird zu keinem Zeitpunkt auf die übrigenen Elemente zugegriffen. Also dies ist die gesamte Funktion des Listeners. Der Konstruktor des Popups erzeugt auch nur die JButtons (derzeit noch ohne Funktion), legen die Positionen fest und fügt diese dem Frame hinzu. Zusätzlich wird ein Boolean implementiert, der weiter unten in der Schleife abgefragt wird.
 
Tatsächlich - habe es gerade nochmal mit Breakpoints geprüft - werden alle Codesegmente in der richtigen Reihenfolge und rechtzeitig ausgeführt. Dennoch funktioniert oben gezeigter Code ohne ein wait() nicht. Es werden die Buttons nicht dargestellt...
 
Glaube du hast meine Antwort nicht verstanden. Du machst eine while true im EventDispatcherThread. Das bedeutet der Thread kann nix neu zeichnen bzw auf Events reagieren da er in der while true, deswegen hängt deine GUI und Deswegen nutzt man Modale Fenster bzw Dialoge...

EDIT

Mann könnte auch ein Callback an dein Fenster machen, was beim Schließen aufgerufen wird. Damit musst du nicht aktiv warten..
 

Zurück
Oben