Was ist der richtige Weg, um eine Swing-Anwendung aus dem Code zu beenden, und was sind die Fallstricke?
Ich habe versucht, meine Anwendung automatisch zu schließen, nachdem ein Timer ausgelöst wurde. Aber nur das Aufrufen dispose()
des JFrame
hat nicht geholfen - das Fenster verschwand, aber die Anwendung wurde nicht beendet. Wenn Sie das Fenster jedoch mit der Schaltfläche Schließen schließen, wird die Anwendung beendet. Was soll ich machen?
Antworten:
Ihre JFrame-Standardschließaktion kann auf "
DISPOSE_ON_CLOSE
" anstatt "gesetzt werdenEXIT_ON_CLOSE
(warum Benutzer weiterhin EXIT_ON_CLOSE verwenden, ist mir ein Rätsel).Wenn Sie nicht bereitgestellte Fenster oder Nicht-Daemon-Threads haben, wird Ihre Anwendung nicht beendet. Dies sollte als Fehler angesehen werden (und das Lösen mit System.exit ist eine sehr schlechte Idee).
Die häufigsten Schuldigen sind java.util.Timer und ein benutzerdefinierter Thread, den Sie erstellt haben. Beide sollten auf Daemon gesetzt sein oder müssen explizit beendet werden.
Wenn Sie nach allen aktiven Frames suchen möchten, können Sie verwenden
Frame.getFrames()
. Wenn alle Windows / Frames entsorgt sind, überprüfen Sie mit einem Debugger, ob noch Nicht-Daemon-Threads ausgeführt werden.quelle
back
Fenster verwenden können? Wenn das zweite Fenster dann geschlossen wird und SieDISPOSE_ON_CLOSE
das Programm verwenden, wird es nicht beendet, da das erste Fenster immer noch "nicht verfügbar" ist. Gibt es eine Möglichkeit, dies ohne Verwendung zu lösenDISPOSE_ON_CLOSE
?Ich denke ein EXIT_ON_CLOSE
Vorher
System.exit(0)
ist besser, da Sie einen Fenster-Listener schreiben können, um einige Reinigungsvorgänge durchzuführen, bevor Sie die App tatsächlich verlassen.Mit diesem Fenster-Listener können Sie Folgendes definieren:
quelle
Versuchen:
Roh, aber effektiv.
quelle
Vielleicht ist der sichere Weg so etwas wie:
quelle
Frame
mit einem Großbuchstaben zu benennen , genau wie der Name einer Klasse…Das folgende Programm enthält Code, der ein Programm ohne fremde Threads beendet, ohne System.exit () explizit aufzurufen. Um dieses Beispiel auf Anwendungen anzuwenden, die Threads / Listener / Timer / usw. verwenden, muss nur ein Bereinigungscode eingefügt werden, der ihre Beendigung anfordert (und gegebenenfalls abwartet), bevor das WindowEvent manuell in actionPerformed () initiiert wird.
Für diejenigen, die Code kopieren / einfügen möchten, der genau wie gezeigt ausgeführt werden kann, ist am Ende eine leicht hässliche, aber ansonsten irrelevante Hauptmethode enthalten.
quelle
Wenn ich Sie richtig verstehe, möchten Sie die Anwendung schließen, auch wenn der Benutzer nicht auf die Schaltfläche Schließen geklickt hat. Sie müssen WindowEvents möglicherweise bei addWindowListener () oder enableEvents () registrieren, je nachdem, was Ihren Anforderungen besser entspricht.
Sie können das Ereignis dann mit einem Aufruf von processWindowEvent () aufrufen. Hier ist ein Beispielcode, der einen JFrame erstellt, 5 Sekunden wartet und den JFrame ohne Benutzerinteraktion schließt.
Wie Sie sehen können, bewirkt die processWindowEvent () -Methode, dass das WindowClosed-Ereignis ausgelöst wird, wenn Sie vor dem Schließen der Anwendung die Möglichkeit haben, bei Bedarf Bereinigungscode auszuführen.
quelle
Schauen Sie sich die Oracle-Dokumentation an .
Ab JDK 1.4 wird eine Anwendung beendet, wenn:
Eckkästen:
Das Dokument besagt, dass einige Pakete anzeigbare Komponenten erstellen, ohne sie freizugeben. Ein Programm, das Toolkit.getDefaultToolkit () aufruft, wird nicht beendet. wird unter anderem als Beispiel gegeben.
Auch andere Prozesse können AWT am Leben erhalten, wenn sie aus irgendeinem Grund Ereignisse in die native Ereigniswarteschlange senden.
Außerdem habe ich festgestellt, dass es auf einigen Systemen einige Sekunden dauert, bis die Anwendung tatsächlich beendet wird.
quelle
Ich denke, die Idee ist hier der WindowListener - Sie können dort jeden Code hinzufügen, den Sie ausführen möchten, bevor das Ding heruntergefahren wird
quelle
In Reaktion auf andere Kommentare scheint DISPOSE_ON_CLOSE die Anwendung nicht ordnungsgemäß zu beenden - es zerstört nur das Fenster, aber die Anwendung wird weiterhin ausgeführt. Wenn Sie die Anwendung beenden möchten, verwenden Sie EXIT_ON_CLOSE.
quelle