Was ist der richtige Weg, um eine JFrame
zu schließen, genauso als ob der Benutzer die X
Schaltfläche zum Schließen gedrückt oder Alt+ F4(unter Windows) gedrückt hätte ?
Ich habe meine Standard-Schließoperation so eingestellt, wie ich es möchte:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Mit den oben genannten Steuerelementen macht es genau das, was ich will. Bei dieser Frage geht es nicht darum.
Was ich wirklich tun möchte, ist, dass sich die GUI genauso verhält wie ein Druck auf die X
Schaltfläche "Schließen".
Angenommen, ich würde WindowAdaptor
eine Instanz meines Adapters als Listener über erweitern und dann hinzufügen addWindowListener()
. Ich möchte die gleiche Reihenfolge der Anrufe durch , um zu sehen windowDeactivated()
, windowClosing()
und windowClosed()
wie bei der auftreten würde X
Schließen - Schaltfläche. Das Fenster nicht so sehr aufreißen, als dass es sich sozusagen aufreißen soll.
Antworten:
Wenn Sie möchten, dass sich die GUI so verhält, als hätten Sie auf die
X
Schaltfläche zum Schließen geklickt , müssen Sie ein Ereignis zum Schließen des Fensters an die sendenWindow
. Mit "ExitAction
Vom Schließen einer Anwendung" können Sie diese Funktionalität einem Menüelement oder einer Komponente hinzufügen, dieAction
s problemlos verwendet.quelle
Nicht zu knifflig.
quelle
Wenn Sie mit Alt-F4 oder X "Beenden Sie die Anwendung sofort, ohne Rücksicht darauf, was andere Windows oder Threads ausführen" meinen, dann
System.exit(...)
tun Sie genau das , was Sie wollen, auf sehr abrupte, brutale und möglicherweise problematische Weise.Wenn Sie mit Alt-F4 oder X das Fenster ausblenden meinen,
frame.setVisible(false)
schließen Sie das Fenster auf diese Weise. Das Fenster verbraucht weiterhin Ressourcen / Speicher, kann jedoch sehr schnell wieder sichtbar gemacht werden.Wenn Sie mit Alt-F4 oder X das Fenster ausblenden und alle verbrauchten Ressourcen entsorgen möchten,
frame.dispose()
schließen Sie das Fenster auf diese Weise. Wenn der Frame das letzte sichtbare Fenster war und keine anderen Nicht-Daemon-Threads ausgeführt werden, wird das Programm beendet. Wenn Sie das Fenster erneut anzeigen, müssen alle nativen Ressourcen (Grafikpuffer, Fensterhandles usw.) erneut initialisiert werden.dispose()
ist möglicherweise dem Verhalten am nächsten, das Sie wirklich wollen. Wenn in Ihrer App mehrere Fenster geöffnet sind, möchten Sie, dass Alt-F4 oder X die App beenden oder einfach das aktive Fenster schließen?Das Java Swing-Lernprogramm für Fensterlistener kann Ihnen dabei helfen, die Dinge für Sie zu klären.
quelle
Wenn Sie dies getan haben, um sicherzustellen, dass der Benutzer das Fenster nicht schließen kann:
Dann sollten Sie Ihre
pullThePlug()
Methode ändernIch fand, dass dies der einzige Weg ist, der gut mit dem
WindowListener
und spieltJFrame.DO_NOTHING_ON_CLOSE
.quelle
Hier wären Ihre Optionen:
quelle
Das Beenden des Java-Ausführungsprozesses ist sehr einfach. Grundsätzlich müssen Sie nur zwei einfache Dinge tun:
System.exit(...)
am Beendigungspunkt der Anwendung auf. Wenn Ihre Anwendung beispielsweise rahmenbasiert ist, können Sie Listener hinzufügenWindowAdapter
undSystem.exit(...)
innerhalb ihrer Methode aufrufenwindowClosing(WindowEvent e)
.Hinweis: Sie müssen aufrufen, da
System.exit(...)
sonst Ihr Programm fehlerhaft ist.System.exit(...)
an der richtigen Stelle hinzufügen , bedeutet dies jedoch nicht, dass die Methode immer aufgerufen werden kann, da unerwartete Java-Ausnahmen den Aufruf der Methode verhindern können.Dies hängt stark mit Ihren Programmierkenntnissen zusammen.
** Im Folgenden finden Sie ein einfachstes Beispiel (
JFrame
basierend), das Ihnen zeigt, wie Sie die Exit-Methode aufrufenquelle
Versuchen Sie Folgendes, um nicht nur den JFrame zu schließen, sondern auch WindowListener-Ereignisse auszulösen:
quelle
Der beste Weg, einen Swing-Frame programmgesteuert zu schließen, besteht darin, ihn so zu verhalten, als würde er sich beim Drücken der Taste "X" verhalten. Dazu müssen Sie WindowAdapter implementieren, das Ihren Anforderungen entspricht, und die Standard-Schließoperation des Frames so einstellen, dass nichts unternommen wird (DO_NOTHING_ON_CLOSE).
Initialisieren Sie Ihren Frame wie folgt:
Sie können den Frame programmgesteuert schließen, indem Sie ihm das Ereignis WINDOW_CLOSING wie folgt senden:
Dadurch wird der Rahmen geschlossen, als ob die Taste "X" gedrückt wurde.
quelle
Wenn Sie wirklich nicht möchten, dass Ihre Anwendung beendet wird, wenn ein JFrame geschlossen wird, dann
verwenden :
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
anstatt :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Hier ist eine Übersicht darüber, wie die Lösung aussieht:
quelle
Diese Antwort wurde von Alex gegeben und ich möchte sie empfehlen. Es hat bei mir funktioniert und eine andere Sache ist einfach und so einfach.
quelle
Dieses Beispiel zeigt, wie der bestätigte Fensterschließvorgang realisiert wird.
Das Fenster verfügt über einen Fensteradapter, der den Standard- Schließvorgang auf Ihre Antwort in der
EXIT_ON_CLOSE
oder inDO_NOTHING_ON_CLOSE
Abhängigkeit von dieser umschaltetOptionDialog
.Die Methode
closeWindow
desConfirmedCloseWindow
feuert ein Fenster schließen Ereignis und kann überall dh als Aktion eines Menüpunktes verwendet werdenquelle
Basierend auf den hier bereits gegebenen Antworten habe ich dies folgendermaßen implementiert:
Der JFrame bringt das Ereignis zum Schließen und wird beim Schließen beendet.
quelle
Sie müssen den Anruf in die AWT-Nachrichtenwarteschlange einfügen, damit das gesamte Timing korrekt abläuft. Andernfalls wird nicht die richtige Ereignissequenz ausgelöst, insbesondere in einem Multithread-Programm. Wenn dies erledigt ist, können Sie die resultierende Ereignissequenz genau so behandeln, als ob der Benutzer auf die Schaltfläche [x] für einen vom Betriebssystem unterstützten dekorierten JFrame geklickt hätte.
quelle
Ich habe dies versucht, schreibe deinen eigenen Code für das Ereignis formWindowClosing () .
Dadurch wird der Benutzer gefragt, ob er den Frame oder die Anwendung beenden möchte.
quelle
Posten, was sich im Fragenkörper befand, als CW-Antwort.
Wollte die Ergebnisse teilen, die hauptsächlich aus dem folgenden Link von camickr stammen. Grundsätzlich muss ich ein
WindowEvent.WINDOW_CLOSING
in die Ereigniswarteschlange der Anwendung werfen . Hier ist eine Zusammenfassung, wie die Lösung aussiehtquelle
Wenn Sie nicht möchten, dass Ihre Anwendung beendet wird, wenn ein JFrame geschlossen wird, verwenden Sie: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
anstelle von: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
Aus der Dokumentation:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
: Tu nichts; Das Programm muss die Operation in der windowClosing-Methode eines registrierten WindowListener-Objekts ausführen.HIDE_ON_CLOSE (defined in WindowConstants)
: Versteckt den Frame automatisch, nachdem registrierte WindowListener-Objekte aufgerufen wurden.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Verstecken und entsorgen Sie den Frame automatisch, nachdem Sie registrierte WindowListener-Objekte aufgerufen haben.EXIT_ON_CLOSE (defined in JFrame)
: Beenden Sie die Anwendung mit der System-Exit-Methode. Verwenden Sie dies nur in Anwendungen.könnte immer noch nützlich sein: Sie können
setVisible(false)
auf Ihrem JFrame verwenden, wenn Sie denselben Frame erneut anzeigen möchten. Andernfalls rufen Siedispose()
auf, um alle nativen Bildschirmressourcen zu entfernen.kopiert von Peter Lang
https://stackoverflow.com/a/1944474/3782247
quelle
quelle
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);