# JFrame: Abfrage ob schliessen oder nicht?



## Angel4585 (5. Jan 2008)

Hallo,

ich möchte bei einem dispose() eines Fensters en Abfrage machen ob wirklich geschlossen werden soll oder nicht.

ich denke mal das dies im WindowClosing-Event sein wird. 
Wie genau mach ich das da? irgendwas mit dem WindowEvent das übergeben wird?


----------



## Angel4585 (5. Jan 2008)

äh, also was ich eigentlich will ist übrigens das Schliessen abbrechen


----------



## java2000 (5. Jan 2008)

Ich empfehle dir, eine eigene Klasse Xyz zu schreiben, die von WindowsAdapter erbt und dort die Methode windowClosing(WindowEvent e) zu überlagern und dort deine Abfrage zu stellen.
In deinem Fenster schreibst du dann:
this.addWindowListener(new Xyz());


----------



## Angel4585 (5. Jan 2008)

aber ich muss das Schliessen doch so oder so irgendwie abwenden oder nicht?


----------



## L-ectron-X (5. Jan 2008)

Mal ein einfaches Beispiel:

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

public class WindowClosingDemo extends JFrame {
   public WindowClosingDemo(String title) {
      super(title);
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      setSize((int)dim.width*60/100, (int)dim.height*60/100);
      setLocationRelativeTo(null);

      setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
      
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            exit();
         }
      });
      
      JMenuBar menuBar = new JMenuBar();
      
      JMenu fileMenu = new JMenu("Datei");
      JMenuItem exitItem = new JMenuItem("Beenden");
      exitItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            exit();
         }
      });

      fileMenu.add(exitItem);
      menuBar.add(fileMenu);
      
      setJMenuBar(menuBar);
   }
   
   private void exit() {
      int result = JOptionPane.showConfirmDialog(null,
      "Möchten Sie das Programm beenden?",
      "Programm beenden",
      JOptionPane.YES_NO_CANCEL_OPTION);

      switch(result) {
         case JOptionPane.YES_OPTION:
         System.exit(0);

         case JOptionPane.NO_OPTION:
         //vielleicht ist hier was zu tun
      }
   }

   public static void main(String[] args) {
      new WindowClosingDemo("WindowClosingDemo").setVisible(true);
   }
}
```


----------



## Illuvatar (5. Jan 2008)

Also... wir reden hier glaub von zwei unterschiedlichen Sachen 

 - Wenn der User auf das X des Fensters klickt, wird ein WindowClosing-Event erzeugt. Wenn du da nichts weiter machst _(Anmerkung: gilt bei JFrame nur, wenn die defaultClosingOperation = DO_NOTHING_ON_CLOSE ist, sonst ist da nämlich automatishc ein WindowListener)_ wird das Fenster nicht geschlossen. Das heißt, du kannst hier eine Abfrage einbauen, und dann dispose aufrufen oder eben nicht.

 - Wenn dein Programm, oder evtl. irgendein anderes dispose() aufruft, kannst du nichts mehr verhindern, außer du veränderst, d.h. überschreibst dispose() in einer eigenen Klasse und machst da deine Abfrage. Und rufst dann super.dispose() auf oder eben nicht. (musst auch noch setVisible(false) beachten, dass das auch sein kann)


----------



## Angel4585 (5. Jan 2008)

ok, und wie löse ich dieses Event manuell aus? Also ein Abbrechen Button oder so. Da soll das selbe kommen wie beim KLick auf X


----------



## L-ectron-X (5. Jan 2008)

Ich habe dafür obigen Code mal dahingehend angepasst.


----------



## Angel4585 (6. Jan 2008)

cool danke! Codebeispiele sind eben doch am einfachsten zu verstehen


----------

