Ich verstehe nicht, wie ich diesen Code verwenden kann:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
um das Programm mit der Taste x zu schließen.
Du brauchst die Leitung
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Weil das Standardverhalten für den JFrame beim Drücken der X-Taste dem Äquivalent entspricht
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
Daher müssen Sie diese Zeile fast immer manuell hinzufügen, wenn Sie Ihren JFrame erstellen
Ich beziehe mich derzeit auf Konstanten in WindowConstants
wie WindowConstants.EXIT_ON_CLOSE
anstatt auf dieselben Konstanten, die direkt in JFrame
deklariert wurden, da der vorherige die Absicht besser widerspiegelt.
Wenn Sie es nicht haben, wird der JFrame einfach entsorgt. Der Frame wird geschlossen, die App wird jedoch weiterhin ausgeführt.
Der Aufruf von setDefaultCloseOperation(EXIT_ON_CLOSE)
macht genau das. Dies bewirkt, dass die Anwendung beendet wird, wenn die Anwendung ein Fensterereignis vom Betriebssystem empfängt. Durch Drücken der Schaltfläche close (X) in Ihrem Fenster generiert das Betriebssystem ein Fensterereignis und sendet es an Ihre Java-Anwendung. Das Fenster zum Schließen des Fensters wird von der AWT-Ereignisschleife in Ihrer Java-Anwendung verarbeitet, die die Anwendung als Reaktion auf das Ereignis beendet.
Wenn Sie diese Methode nicht aufrufen, kann die AWT-Ereignisschleife die Anwendung möglicherweise nicht als Reaktion auf das Fensterereignis beenden, sondern im Hintergrund laufen lassen.
Ich habe ziemlich viel Zeit damit verbracht, durch das Internet nach einer eleganten Lösung dafür zu suchen. Wie üblich fand ich viele widersprüchliche Informationen.
Ich endete schließlich mit:
EXIT_ON_CLOSE
, da dies Ressourcen hinterlassen kann.Verwenden Sie in der JFrame-Initialisierung so etwas wie das Folgende:
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Die eigentliche Entdeckung bestand darin, eine Fenstermeldung an den JFrame zu senden. Verwenden Sie als Beispiel für Ihr JMenuItem zum Beenden der Anwendung Folgendes, wobei die Funktion getFrame()
einen Verweis auf den JFrame zurückgibt:
public class AppMenuFileExit extends JMenuItem implements ActionListener
{
// do your normal menu item code here
@Override
public void actionPerformed(ActionEvent e)
{
WindowEvent we;
we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
App.getFrame().dispatchEvent(we);
}
}
JFrame ist eine Unterklasse von Window und kann zu diesem Zweck in Window umgewandelt werden.
Und haben Sie in Ihrer JFrame-Klasse Folgendes, um Fenstermeldungen zu verarbeiten:
public class AppFrame extends JFrame implements WindowListener
{
// Do all the things you need to for the class
@Override
public void windowOpened(WindowEvent e)
{}
@Override
public void windowClosing(WindowEvent e)
{/* can do cleanup here if necessary */}
@Override
public void windowClosed(WindowEvent e)
{
dispose();
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e)
{}
@Override
public void windowDeactivated(WindowEvent e)
{}
@Override
public void windowDeiconified(WindowEvent e)
{}
@Override
public void windowIconified(WindowEvent e)
{}
}
Wenn Sie einen Frame (Class Extends Frame) verwenden, erhalten Sie keinen
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
das klappte bei Class Extends Frame für mich
Wenn Sie JFrame
nicht erweitern und JFrame
selbst in variable verwenden, können Sie Folgendes verwenden:
frame.dispose();
System.exit(0);
Der folgende Code funktioniert für mich:
System.exit(home.EXIT_ON_CLOSE);