webentwicklung-frage-antwort-db.com.de

JFrame Exit beim Schließen von Java

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.

47
user983246

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.

73
Jaime Hablutzel

Wenn Sie es nicht haben, wird der JFrame einfach entsorgt. Der Frame wird geschlossen, die App wird jedoch weiterhin ausgeführt.

7
Jeff Storey

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.

4
Brian Coleman

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:

  1. Verwenden Sie nicht EXIT_ON_CLOSE, da dies Ressourcen hinterlassen kann.
  2. Verwenden Sie in der JFrame-Initialisierung so etwas wie das Folgende:

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  3. 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.

  4. 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)
      {}
    }
    
2
Higgs

Wenn Sie einen Frame (Class Extends Frame) verwenden, erhalten Sie keinen 

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
1
Yacine

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

das klappte bei Class Extends Frame für mich

0
Aditya Joshi

Wenn Sie JFrame nicht erweitern und JFrame selbst in variable verwenden, können Sie Folgendes verwenden:

frame.dispose();
System.exit(0);
0
Dmitriy Potapov

Der folgende Code funktioniert für mich:

System.exit(home.EXIT_ON_CLOSE);