So schließen Sie einen JFrame programmgesteuert

Lesezeit: 7 Minuten

So schliesen Sie einen JFrame programmgesteuert
Nur Jeff

Was ist der richtige Weg, um eine JFrame zu schließen, genauso, als ob der Benutzer die gedrückt hätte X Schließen-Taste oder gedrückt Alt+F4 (unter Windows)?

Ich habe meine Standard-Schließoperation so eingestellt, wie ich es möchte, über:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Es macht genau das, was ich will, mit den oben genannten Steuerelementen. Bei dieser Frage geht es nicht darum.

Was ich wirklich tun möchte, ist, dass sich die GUI genauso verhält wie das Drücken von X Schließen-Schaltfläche würde dazu führen, dass es sich verhält.

Angenommen, ich würde verlängern WindowAdaptor und füge dann eine Instanz meines Adapters als Listener via hinzu addWindowListener(). Ich möchte die gleiche Abfolge von Anrufen sehen windowDeactivated(), windowClosing()und windowClosed() wie es bei der vorkommen würde X Schließen-Schaltfläche. Nicht so sehr das Fenster zerreißen, sondern ihm sagen, es solle sich sozusagen selbst zerreißen.

  • Ja, jFrame.dispose() soll das Fenster schließen und alles aufräumen?

    – Tom Neyland

    5. August 2009 um 18:31 Uhr

  • Denn dispose entspricht nicht 1:1 dem Schließen des Fensters durch Klicken auf [x]?

    – Grüner alter Mann

    6. Dezember 2011 um 20:04 Uhr

  • Ja gute Frage, ich möchte einen User anklicken [x] Schaltfläche Ich gebe ausdrücklich an, dass ein nicht verzierter JFrame überschrieben werden soll exakt als ob der Benutzer auf das bereitgestellte Betriebssystem geklickt hätte [x] Schaltfläche in einem betriebssystemspezifischen dekorierten JFrame-Fenster.

    – Peterk

    27. Dezember 2012 um 16:53 Uhr

  • Wie wäre es mit this.dispatchEvent(wev); anstelle von Toolkit.getDefaultToolkit … Ersteres ist das, was die akzeptierte Antwort vorschlägt.

    – Jason

    7. April 2013 um 0:00 Uhr

1646320033 941 So schliesen Sie einen JFrame programmgesteuert
camickr

Wenn Sie möchten, dass sich die GUI so verhält, als ob Sie auf die X Schließen-Schaltfläche, dann müssen Sie ein Fensterschließereignis an die senden Window. Die ExitAction von Schließen einer Anwendung ermöglicht es Ihnen, diese Funktionalität zu einem Menüelement oder einer beliebigen Komponente hinzuzufügen, die verwendet wird Actionist leicht.

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

  • Muss ich this.jframe.addWindowListener hinzufügen (new WindowAdapter() { @Override public void windowClosing( WindowEvent e ) { e.getWindow().dispose(); } }); bevor du das anrufst? Oder schließt es auch das Fenster?

    – mjs

    25. Juli 2017 um 23:04 Uhr

  • “How to programmatically close a JFrame” – Wenn JFrame.EXIT_ON_CLOSE nicht gesetzt ist, wird es nicht geschlossen. Wie auch immer, ich habe nur darauf hingewiesen, dass es möglicherweise erforderlich ist, die Antwort zu ergänzen, da jframe.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); wird es nicht wirklich schließen, indem dieses Ereignis ausgelöst wird, obwohl der Benutzer normalerweise in der Lage ist, das Fenster auf X zu schließen, selbst wenn DO_NOTHING_ON_CLOSE gesetzt ist, aber das Auslösen dieses Ereignisses wird es nicht tun. Sieh den Unterschied?

    – mjs

    26. Juli 2017 um 14:57 Uhr


  • @momomo, es war nicht nötig, auf irgendetwas hinzuweisen. Diese Antwort wird genau das tun, was das OP verlangt hat. Es wird alles tun, was die “X”-Schließen-Schaltfläche tut. Der Titel der Frage ist nicht die Frage. Das OP hat ausdrücklich angegeben, dass der Standard-Schließvorgang auf “Beenden” eingestellt ist. Was das “Nichts tun” tut, ist also irrelevant, da das OP nicht danach gefragt hat. Bitte löschen Sie alle Ihre Kommentare, damit Sie andere Personen, die diese Antwort lesen, nicht verwirren, da die Antwort gegeben wurde, um die Frage des OP direkt zu beantworten, nicht Ihre Interpretation der Überschrift der Frage.

    – camickr

    26. Juli 2017 um 16:33 Uhr

  • Diese Antwort ist für jedes nicht triviale Szenario nutzlos, da der Grund, warum ich den Rahmen programmgesteuert schließen möchte, in jedem nicht trivialen Szenario genau darin besteht, dass ich das Ereignis “Schließen” bereits behandelt und verschiedene Maßnahmen ergriffen habe, um festzustellen, ob die Rahmen tatsächlich schließen sollte, haben festgestellt, dass der Rahmen tatsächlich geschlossen werden sollte, und versuchen nun, ihn tatsächlich zu schließen. Das erneute Aufrufen des “Closing”-Ereignisses würde also eine unendliche Rekursion verursachen.

    – Mike Nakis

    30. April 2021 um 10:35 Uhr

setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object

Nicht zu schwierig.

  • Aber das ruft keine Ereignis-Listener auf.

    – Bombe

    15. September 2009 um 19:17 Uhr

  • Wenn dies eine Schließen-Schaltfläche wäre, wird der Prozess ebenfalls im Hintergrund ausgeführt.

    – Austin A

    13. März 2015 um 21:28 Uhr

  • Nicht, wenn die standardmäßige Schließoperation auf EXIT_ON_CLOSE ist oder der Schaltflächen-Listener alle erforderlichen Ressourcenschließungen durchführt.

    – Melinda Grün

    13. März 2016 um 11:16 Uhr

  • Es ruft die Zuhörer nicht.

    – Stefan Reich

    27. August 2017 um 2:10 Uhr

  • von dem, was ich beobachte, anrufend dispose() bewirkt tatsächlich, dass die Listener-Ereignisse “deaktiviert” und “geschlossen” ausgegeben werden. Also, ich weiß nicht, worüber sich die Kommentatoren oben beschweren.

    – Mike Nakis

    30. April 2021 um 10:47 Uhr


So schliesen Sie einen JFrame programmgesteuert
Jakob Schek

Wenn Sie mit Alt-F4 oder X meinen: “Anwendung sofort beenden, ohne Rücksicht darauf, welche anderen Fenster oder Threads ausgeführt werden”, dann System.exit(...) Wird besorgt exakt was Sie wollen, auf sehr abrupte, brutale und möglicherweise problematische Weise.

Wenn Sie mit Alt-F4 oder X das Fenster ausblenden meinen, dann frame.setVisible(false) So “schließt” man das Fenster. Das Fenster wird weiterhin Ressourcen/Speicher verbrauchen, kann aber sehr schnell wieder sichtbar gemacht werden.

Wenn Sie mit Alt-F4 oder X meinen, das Fenster auszublenden und alle Ressourcen zu entsorgen, die es verbraucht, dann frame.dispose() So “schließt” man das Fenster. Wenn der Frame das letzte sichtbare Fenster war und keine anderen Nicht-Daemon-Threads laufen, wird das Programm beendet. Wenn Sie das Fenster erneut anzeigen, müssen alle nativen Ressourcen neu initialisiert werden (Grafikpuffer, Fensterhandles usw.).

dispose() könnte dem Verhalten, das Sie wirklich wollen, am nächsten kommen. Wenn Ihre App mehrere Fenster geöffnet hat, möchten Sie, dass Alt-F4 oder X die App beenden oder nur das aktive Fenster schließen?

Die Java-Swing-Tutorial zu Fenster-Listenern kann helfen, die Dinge für Sie zu klären.

1646320035 792 So schliesen Sie einen JFrame programmgesteuert
Gazihan Alankus

Wenn Sie dies getan haben, um sicherzustellen, dass der Benutzer das Fenster nicht schließen kann:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Dann solltest du deine wechseln pullThePlug() Methode zu sein

public void pullThePlug() {
    // this will make sure WindowListener.windowClosing() et al. will be called.
    WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);

    // this will hide and dispose the frame, so that the application quits by
    // itself if there is nothing else around. 
    setVisible(false);
    dispose();
    // if you have other similar frames around, you should dispose them, too.

    // finally, call this to really exit. 
    // i/o libraries such as WiiRemoteJ need this. 
    // also, this is what swing does for JFrame.EXIT_ON_CLOSE
    System.exit(0); 
}

Ich fand, dass dies der einzige Weg ist, der gut mit dem spielt WindowListener und JFrame.DO_NOTHING_ON_CLOSE.

1646320037 925 So schliesen Sie einen JFrame programmgesteuert
Aaron Esau

Hier wären deine Möglichkeiten:

System.exit(0); // stop program
frame.dispose(); // close window
frame.setVisible(false); // hide window

So schliesen Sie einen JFrame programmgesteuert
Sai Kishore

Das Beenden des laufenden Java-Prozesses ist sehr einfach, im Grunde müssen Sie nur zwei einfache Dinge tun:

  1. Java-Methode aufrufen System.exit(...) at am Beendigungspunkt der Anwendung. Wenn Ihre Anwendung beispielsweise Frame-basiert ist, können Sie einen Listener hinzufügen WindowAdapter und und anrufen System.exit(...) innerhalb seiner Methode windowClosing(WindowEvent e).

Hinweis: Sie müssen anrufen System.exit(...) andernfalls ist Ihr Programm fehlerbehaftet.

  1. Vermeiden unerwarteter Java-Ausnahmen, um sicherzustellen, dass die Exit-Methode immer aufgerufen werden kann. Wenn Sie hinzufügen System.exit(...) an der richtigen Stelle, aber es bedeutet nicht, dass die Methode immer aufgerufen werden kann, da unerwartete Java-Ausnahmen verhindern können, dass die Methode aufgerufen wird.

Dies hängt stark mit Ihren Programmierkenntnissen zusammen.

** Es folgt ein einfachstes Beispiel (JFrame based), die Ihnen zeigt, wie Sie die Exit-Methode aufrufen

import java.awt.event.*;
import javax.swing.*;

public class ExitApp extends JFrame
{
   public ExitApp()
   {
      addWindowListener(new WindowAdapter()
      {
         public void windowClosing(WindowEvent e)
         {
           dispose();
           System.exit(0); //calling the method is a must
         }
      });
   }

   public static void main(String[] args)
   {
      ExitApp app=new ExitApp();
      app.setBounds(133,100,532,400);
      app.setVisible(true);
   }
}

1646320038 359 So schliesen Sie einen JFrame programmgesteuert
Vogel612

Versuchen Sie Folgendes, um nicht nur den JFrame zu schließen, sondern auch WindowListener-Ereignisse auszulösen:

myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));

924610cookie-checkSo schließen Sie einen JFrame programmgesteuert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy