# JFrame, JOptionPane - vor dem Schließen Benutzer fragen



## ulr!ch (14. Jul 2005)

Hi JavaGemeinde,

ich möchte gerne, wenn man den Frame schließt (Klicken auf das kleine rote Kreuz unter Windows XP) einen JOptionPane zur Bestätigung einblenden, ob der User auch wirklich sicher ist, dass er das Prog beenden möchte und nicht etwa unabsichtlich darauf geklickt hat. Wie mache ich das?
Hier der Code:

```
public static void main(String args[]) throws Exception {
    JFrame frame = new ABC();
    frame.pack();
    frame.setVisible(true);
    frame.setExtendedState(MAXIMIZED_BOTH);
    frame.setResizable(false);
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
	int resultBeenden = JOptionPane.showConfirmDialog(this, "<html>Wollen Sie das Programm [b]wirklich[/b] beenden?</html>", "ABC", 0, 2);
	if (resultBeenden==JOptionPane.YES_OPTION) {
	  System.exit(0);
	}
	    else if (result_beenden==JOptionPane.NO_OPTION) {}      }
    });
  }
```
Aber das "this" stimmt "natürlich" nicht, frame habe ich schon ausprobiert. Vielleicht bin ich völlig auf dem Holzweg, aber weiß jemand, was ich meine?

By<e Ulrich

_L-ectron-X hat den Titel angepasst._


----------



## spoensche (15. Jul 2005)

Anstatt der zahlen (0,2) empfehle ich die in der klasse JOptionPane vordefinierten öffentlichen integer optionen zu benutzen, siehe dokumentation.
Du musst "frame" nehmen, weil das JFrame object das übergeordnete eltern object (container bzw. component) darstellt. "this" kannst du benutzten, wenn deine klasse von JFrame erbt.

Ein gutes leicht verständliches kostenloses java buch findest du hier : 
http://www.galileocomputing.de/openbook/javainsel4/

So sollte es funktionieren:

```
//frame ist das eltern objekt des JOptionPanes
 int resultBeenden = JOptionPane.showInternalConfirmDialog(frame, "Wollen Sie das Programm wirklich beenden?", "ABC", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
   if (resultBeenden==JOptionPane.YES_OPTION) {
     System.exit(0);
   }
```


----------



## ulr!ch (15. Jul 2005)

spoensche hat gesagt.:
			
		

> So sollte es funktionieren:


Mit dem kleinen Schönheitsfehler, dass das nicht funktioniert, wie ich bereits in der Frage geschrieben hatte.
Altbekannte Fehlermeldung: aus einer verschachtelten Klasse kann nicht auf eine lokale Varible zugegriffen werden...
Wenn ich die Variable als global definiere, dann kommt bekannte non-static / static - Fehlermeldung.
Und ja, ich habe das hier in der FAQ auch gelesen.
Aber hier verhält es sich irgendwie anders, weil die abc gleichzeitig die Hauptklasse ist. Kann ich das dann überhaupt global definieren?

```
public class abc extends JFrame implements ActionListener {
  abc frame = new abc();
[...]
  public static void main(String args[]) throws Exception {
    frame.pack();
    frame.setVisible(true);
    frame.setExtendedState(MAXIMIZED_BOTH);
[...]
```
 :? Irgendetwas habe ich da nicht verstanden.
Für Anregungen dankbar,

Ulrich


----------



## spoensche (15. Jul 2005)

Du brauchst nicht noch ein extra frame objekt anzulegen, sondern kannst mit dem aufruf der methode super() im Konstruktor der klasse abc sämtliche methoden und eigenschaften von jframe erben.

```
public ABC extends JFrame implements ActionListener {
        public ABC() {
            //instantiert das eltern object mit dem konstruktor der als übergabe den parameter title erwartet und sorgt für 
            // für die vererbung.

            super("Mein erstes Fenster");

            try {
                //initialisiert die komponenten, die dem fenster hinzugefügt werden sollen.
                initComponents();
            }
            catch (Exception e) {
                 e.printStackTrace();
            }
        }

        private void initComponents() throws Exception {
              setSize(250,600);
              setVisible(true);
              getContentPane().setLayout(new BorderLayout());

              ....
              //weitere komponenten

             show(),
        }

        public static void main(String[] arg) {
             new ABC();
        }
}
```


----------



## ulr!ch (15. Jul 2005)

:?: 
Sorry, vielleicht bin ich ja echt zu blöd, aber wo soll denn da jetzt das JOptionPane.showConfirmDialog(xxx ...) hin?
Da habe ich doch genau dasselbe Problem. In die Klasse "private void initComponents()" ? Wie kann ich das "referebzieren"?

By<e Ulrich
PS: BTW show ist als "deprecated" eingestuft.


----------



## sisko78 (15. Jul 2005)

z.b. so:


```
private void initComponents() throws Exception {
        setSize(250, 600);
        setVisible(true);
        getContentPane().setLayout(new BorderLayout());
        setExtendedState(MAXIMIZED_BOTH);
        setResizable(false);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                int resultBeenden = JOptionPane.showConfirmDialog(ABC.this,
                        "<html>Wollen Sie das Programm [b]wirklich[/b] beenden?</html>",
                        "ABC", 0, 2);
                if (resultBeenden == JOptionPane.YES_OPTION) {
                    System.exit(0);
                } else if (resultBeenden == JOptionPane.NO_OPTION) {}
            }
        });

    }
```


----------



## ulr!ch (15. Jul 2005)

spoensche, sisko78 - hey, ihr seit halt doch die Besten!
Jetzt funktioniert alles so, wie es sein soll. 
Nachdem ich noch

```
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
```
gesetzt hatte, ist er auch nicht rausgeflogen, wenn ich dann >Nein< gedrückt habe.
Danke noch einmal ihr beiden.

Ciao, Ulrich


----------



## L-ectron-X (15. Jul 2005)

Das Thema kam nicht zum ersten Mal. Bitte auch mal die Suchfunktion benutzen!


----------



## ulr!ch (15. Jul 2005)

L-ectron-X hat gesagt.:
			
		

> Das Thema kam nicht zum ersten Mal. Bitte auch mal die Suchfunktion benutzen!


Bevor ich post, suche ich zuerst immer im Forum nach Einträgen und google natürlich auch.
Aber für "JFrame JOption", "frame JOption" habe ich nichts gefunden.
Hätte ich gewusst, worauf es hinausläuft, hätte ich den Eintrag finden können. Aber der hätte mir in meinem Fall ehrlich gesagt auch nicht weitergeholfen. 
Ich verstehe ja deine Bedenken L-ectron-X, aber hier scheint sie mir ein wenig fehl am Platz.

By<e Ulrich


----------



## L-ectron-X (16. Jul 2005)

Ich will ja auch keinen Stress machen, nur etwas an eure Kreativität appellieren. :wink: 
http://www.java-forum.org/de/viewtopic.php?t=942&highlight=vor+dem+schlie%DFen


----------



## ulr!ch (16. Jul 2005)

OK, den habe ich nicht gefunden... :?
und dieser Artikel hätte mir tatsächlich auch die Lösung für mein Problem, nämlich null statt this gebracht...

Thx & by<e Ulrich


----------

