Java Swing dispose () vs. setVisible (false)

8

Ich habe eine eigenständige Java-Anwendung, die Daten aus einer Datenbank abruft und sie in einer JTable anzeigt. Wenn die Anwendung gestartet wird, wird der Benutzer in einem JDialog nach einem Benutzernamen / Passwort gefragt. Sobald die korrekten Zugangsdaten eingegeben sind, wird der Haupt-JFrame angezeigt, der die Daten enthält. Auf dem Haupt-JFrame habe ich eine Abmeldeschaltfläche, die nach dem Anklicken den Haupt-JFrame schließen und den Anmelde-JDialog erneut anzeigen sollte. Alles funktioniert größtenteils, außer dass ich festgestellt habe, dass der Haupt-JFrame nicht verschwindet, wenn auf die Schaltfläche zum Abmelden geklickt wird. Unten ist ein kleines funktionierendes Beispiel meines Codes:

Main.java:

%Vor%

MainFrame.java:

%Vor%

MyDialog.java:

%Vor%

Wenn ich in MainFrame.java die Zeile setVisible(false) in dispose() ändere, verschwindet der JFrame, wenn ich auf die Schaltfläche klicke. Meine Frage ist, warum funktioniert das mit dispose() und nicht mit setVisible(false) ? Gibt es einen besseren Weg, meinen Code zu organisieren? Ich bin neu in Swing, also entschuldige ich mich, wenn das eine grundlegende Frage ist. Danke.

EDITED 2011-10-19 10:26 PDT

Danke euch allen für eure Hilfe. Ich habe den JDialog geändert, um einen Null-Elternteil zu haben, und jetzt funktioniert alles wie ich wollte.

    
user1002119 18.10.2011, 22:55
quelle

2 Antworten

6

Siehe die Zeile, in der Sie den JDialog starten:

%Vor%

Sie legen denselben Frame wie den übergeordneten Frame fest, auf dem sich der Dialog befindet. Sie sehen, ein Dialog kann nicht alleine erscheinen, er muss auf einem übergeordneten Rahmen sitzen.

Also in deinem Code, wenn du schreibst:

%Vor%

In der ersten Zeile geben Sie an, dass der Rahmen verschwinden soll. Dann sagen Sie dem Dialog, dass er angezeigt werden soll. Dadurch wird der Dialog im übergeordneten Rahmen angezeigt. Da der übergeordnete Rahmen derselbe ist, sieht er so aus, als ob er für Sie sichtbar bleibt. Wenn Sie die zweite Zeile entfernen, bin ich sicher, dass der Rahmen verschwinden würde. Aber wenn Sie dem Frame mitteilen, dass er entfernt werden soll, verschwindet er vollständig, weil Sie ihm gesagt haben, dass er nicht nur die Sichtbarkeit verlieren, sondern sich auch aus dem Speicher entfernen soll.

Dann, wenn Sie dem Dialog mitteilen, dass er erscheint, sucht er nach seinem JFrame (der entsorgt wurde), initialisiert ihn neu und öffnet sich.

Der Weg zur Lösung Ihres Problems besteht darin, einen separaten neuen JFrame für den JDialog zu erstellen. Verwenden Sie dann nicht dispose und verwenden Sie einfach den setVisible-Befehl.

-Asaf

    
Asaf 18.10.2011, 23:17
quelle
0

Ich gebe einfach den richtigen Code, in meinem eigenen Stil. Es ist sicherlich nicht die einzige oder sogar bewährte beste Lösung.

setVisible (false) auf dem Hauptrahmen sollte die Schließungsoperation logisch für einen Hauptrahmen EXIT_ON_CLOSE aufrufen. Wenn das Dialogfeld ein Kind des Hauptrahmens ist, wird die Anwendung beendet.

Also habe ich den modalen Dialog zu einem zweiten oberen Fenster gemacht, das einen (JFrame) null als Eltern hat. Daher haben Sie eine Anwendung mit zwei oberen Fenstern. Und die modalen Dialoge werden jedes Mal entsorgt. Ich habe den modalen Dialog DO_NOTHING_ON_CLOSE erstellt, da das Symbol "Schließen" nicht funktionieren soll. Daher die dispose () in der actionPerformed. (Wenn Sie zu irgendeinem Zeitpunkt über einen Elternteil verfügen, können Sie getOwner () verwenden, anstatt das übergeordnete Element in ein Feld zu kopieren.)

%Vor%     
Joop Eggen 19.10.2011 00:26
quelle

Tags und Links