# Fenster schließen bei Klick auf Kreuz



## FranzFerdinand (9. Okt 2014)

Wunderschönen guten Tag,

ich habe eine Menge dazu gegooglet, aber keine seriöse Lösung gefunden.
Ich hätte gerne, dass Java beim Klicken auf das Kreuz oben Rechts nicht sofort alles schließt, sondern nachfragt, ob der Nutzer das schließen möchte. Mit Ja oder Nein-Klick.

Das ist mein aktueller Quellcode:

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

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 09.10.2014
  * @author 
  */

public class CafeRoot extends JFrame {
  // Anfang Attribute
  private JLabel jLabelRestkartenTisch = new JLabel();
  private JLabel jLabelRestkartenGast = new JLabel();
  private JLabel jLabelRestbarplaetze = new JLabel();
  private JLabel jLabelHandkartenSpieler1 = new JLabel();
  private JLabel jLabelHandkartenSpieler2 = new JLabel();
  private JLabel jLabelPunkteSpieler1 = new JLabel();
  private JLabel jLabelPunkteSpieler2 = new JLabel();
  private JLabel jLabelSpieler = new JLabel();
  // Ende Attribute
  
  public CafeRoot(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
    int frameWidth = 500; 
    int frameHeight = 350;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    setTitle("Café International");
    
    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    //Notiz: Denke an eine Abfrage, ob das Programm beendet werden solle!
    setLocationRelativeTo(null);
    cp.setLayout(null);
    
    // Anfang Komponenten
    int restkartentisch = 24;
    jLabelRestkartenTisch.setBounds(25, 10, 100, 30);
    jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
    cp.add(jLabelRestkartenTisch);
    //=============================
    int restkartengast = 100;
    jLabelRestkartenGast.setBounds(25, 35, 100, 30);
    jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
    cp.add(jLabelRestkartenGast);
    //=============================
    int restbarplaetze = 21;
    jLabelRestbarplaetze.setBounds(25, 60, 120, 30);
    jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
    cp.add(jLabelRestbarplaetze);
    //=============================
    int handkartenspieler1 = 0;//werden noch ausgeteilt
    jLabelHandkartenSpieler1.setBounds(25, 85, 140, 30);
    jLabelHandkartenSpieler1.setText("Karten Spieler 1: "+handkartenspieler1);
    cp.add(jLabelHandkartenSpieler1);
    //=============================
    int handkartenspieler2 = 0;
    jLabelHandkartenSpieler2.setBounds(25, 110, 140, 30);
    jLabelHandkartenSpieler2.setText("Karten Spieler 2: "+handkartenspieler2);
    cp.add(jLabelHandkartenSpieler2);
    //=============================
    int punktespieler1 = 0;
    jLabelPunkteSpieler1.setBounds(25, 135, 140, 30);
    jLabelPunkteSpieler1.setText("Pkt. Spieler 1: "+punktespieler1);
    cp.add(jLabelPunkteSpieler1);
    //=============================
    int punktespieler2 = 0;
    jLabelPunkteSpieler2.setBounds(25, 160, 140, 30);
    jLabelPunkteSpieler2.setText("Pkt. Spieler 2: "+punktespieler2);
    cp.add(jLabelPunkteSpieler2);
    //=============================
    int spieler = 1;
    jLabelSpieler.setBounds(25, 185, 140, 30);
    jLabelSpieler.setText("Am Zug: Spieler "+spieler);
    cp.add(jLabelSpieler);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public CafeRoot
  
  // Anfang Methoden
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new CafeRoot("CafeRoot");
  } // end of main 
  
} // end of class CafeRoot
```

kann mir da jemand eine Vorlage oder eine seriöse Idee nennen? bitte keine Meckere, ja ich habe keine Ahnung, deshalb frage ich ja nach. 

Vielen Dank.

Grüße
FranzFerdinand


----------



## Faberix (9. Okt 2014)

Hallo,

Das kannst du mit einem WindowListener machen:


```
public class MyWindowListener implements WindowListener {

private CafeRoot cRoot;

public MyWindowListener(CafeRoot cRoot) {
        this.cRoot = cRoot;
}

@Override
	public void windowActivated(WindowEvent arg0) {
		
	}

	@Override
	public void windowClosed(WindowEvent arg0) {
		cRoot.frame.setVisible(false)
 //            was du noch machen willst
	}

	@Override
	public void windowClosing(WindowEvent arg0) {
		
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {
		
	}

	@Override
	public void windowDeiconified(WindowEvent arg0) {
		
	}

	@Override
	public void windowIconified(WindowEvent arg0) {
		
	}

	@Override
	public void windowOpened(WindowEvent arg0) {
		
	}
}
```


Den kannst du dann mit frame.addWindowListener(WindowListener listener); zu deinem JFrame hinzufügen. Ach ja, und du musst bei setDefoultCloseOperation() "JFrame.DO_NOTHING_ON_CLOSE" nehmen.

mfg, Faberix


----------



## arilou (9. Okt 2014)

Und wenn dir das zu viel Code ist, kannst du statt
"implements WindowListener"
auch
"extends WindowAdapter"
nehmen, spart die ganzen leeren Methoden, und du brauchst nur die überschreiben, mit denen du wirklich was machen willst... :bae:

Ach ja, für dein konkreten Problem ist wohl die
.windowClosing
die richtige.


----------



## X5-599 (9. Okt 2014)

Hier mal eine Platzsparende Variante ohne extra Klasse. Kleines Beispiel:


```
public static void main(String[] args)
{
	final JFrame f = new JFrame("Ein Frame zum Schließen");
	f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	f.addWindowListener(new WindowAdapter() {
		@Override
		public void windowClosing(WindowEvent evt)
		{
			int auswahl = JOptionPane.showConfirmDialog(f, "Wirklich beenden?");
			if(auswahl == JOptionPane.YES_OPTION)
			{
				f.dispose();
			}
		}
	});
	f.setVisible(true);
}
```


----------



## FranzFerdinand (9. Okt 2014)

Wunderschönen Guten Abend,

vielen Dank für eure Hilfe. Ich probiere das sofort aus, wenn ich Zugriff darauf habe und berichte davon.
Mir funkt nur gerade generell ein kleines Problem dazwischen. Ich hab zuhause auf dem Mac und in der Schule auf dem Steinzeit-Windoof unterschiedliche Java-Editor-Programme und habe die Datei vorhin in der Schule bearbeitet, krieg es heute in Eclipse zuhause aber nicht mehr zum laufen.

Ich hab jetzt im Verzeichnis die Dateien:
CafeRoot.~ava
CafeRoot.~fm
CafeRoot.class
CafeRoot.java
CafeRoot.jfm

Aber ich krieg da in Eclipse nichts zum laufen, komme mit dem Import irgendwie nicht hinterher.

Entschuldigt meine sehr amateurbelastete Frage, ich hab sonst nie zu Hause programmiert und komm nun mit diesem ständigen Hin-Her-Wechsel nicht klar.

Kann mir da mal jemand kurz sagen, wie ich das anstelle?

Schöne Grüße
FranzFerdinand


----------



## FranzFerdinand (9. Okt 2014)

@Faberix: Ich hab Deine Variante mal als erstes ausprobiert, mein Quelltext sieht nun folgendermaßen aus:

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

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 09.10.2014
  * @author 
  */

public class CafeRoot extends JFrame {
  // Anfang Attribute
  private JLabel jLabelRestkartenTisch = new JLabel();
  private JLabel jLabelRestkartenGast = new JLabel();
  private JLabel jLabelRestbarplaetze = new JLabel();
  private JLabel jLabelHandkartenSpieler1 = new JLabel();
  private JLabel jLabelHandkartenSpieler2 = new JLabel();
  private JLabel jLabelPunkteSpieler1 = new JLabel();
  private JLabel jLabelPunkteSpieler2 = new JLabel();
  private JLabel jLabelSpieler = new JLabel();
  // Ende Attribute
  
  public CafeRoot(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
    int frameWidth = 500; 
    int frameHeight = 350;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    setTitle("Café International");
    
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    
    //Notiz: Denke an eine Abfrage, ob das Programm beendet werden solle!
    setLocationRelativeTo(null);
    cp.setLayout(null);
    
    // Anfang Komponenten
    int restkartentisch = 24;
    jLabelRestkartenTisch.setBounds(25, 10, 100, 30);
    jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
    cp.add(jLabelRestkartenTisch);
    //=============================
    int restkartengast = 100;
    jLabelRestkartenGast.setBounds(25, 35, 100, 30);
    jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
    cp.add(jLabelRestkartenGast);
    //=============================
    int restbarplaetze = 21;
    jLabelRestbarplaetze.setBounds(25, 60, 120, 30);
    jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
    cp.add(jLabelRestbarplaetze);
    //=============================
    int handkartenspieler1 = 0;//werden noch ausgeteilt
    jLabelHandkartenSpieler1.setBounds(25, 85, 140, 30);
    jLabelHandkartenSpieler1.setText("Karten Spieler 1: "+handkartenspieler1);
    cp.add(jLabelHandkartenSpieler1);
    //=============================
    int handkartenspieler2 = 0;
    jLabelHandkartenSpieler2.setBounds(25, 110, 140, 30);
    jLabelHandkartenSpieler2.setText("Karten Spieler 2: "+handkartenspieler2);
    cp.add(jLabelHandkartenSpieler2);
    //=============================
    int punktespieler1 = 0;
    jLabelPunkteSpieler1.setBounds(25, 135, 140, 30);
    jLabelPunkteSpieler1.setText("Pkt. Spieler 1: "+punktespieler1);
    cp.add(jLabelPunkteSpieler1);
    //=============================
    int punktespieler2 = 0;
    jLabelPunkteSpieler2.setBounds(25, 160, 140, 30);
    jLabelPunkteSpieler2.setText("Pkt. Spieler 2: "+punktespieler2);
    cp.add(jLabelPunkteSpieler2);
    //=============================
    int spieler = 1;
    jLabelSpieler.setBounds(25, 185, 140, 30);
    jLabelSpieler.setText("Am Zug: Spieler "+spieler);
    cp.add(jLabelSpieler);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public CafeRoot
  
  // Anfang Methoden
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new CafeRoot("CafeRoot");
  } // end of main 
  public class MyWindowListener implements WindowListener {
	  
	  private CafeRoot cRoot;
	   
	  public MyWindowListener(CafeRoot cRoot) {
	          this.cRoot = cRoot;
	  }
	   
	  @Override
	  	public void windowActivated(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowClosed(WindowEvent arg0) {
	  		cRoot.jFrame.setVisible(false);
	   //            was du noch machen willst
	  	}
	   
	  	@Override
	  	public void windowClosing(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowDeactivated(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowDeiconified(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowIconified(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowOpened(WindowEvent arg0) {
	   
	  	}
	  }
  frame.addWindowListener(WindowListener listener) {
  }
} // end of class CafeRoot
```


Bei

```
public void windowClosed(WindowEvent arg0) {
	  		cRoot.jFrame.setVisible(false);
	   //            was du noch machen willst
```

zeigt er noch an: jFrame kann nicht aufgelöst werden oder ist kein Feld. Ich hab den Kommentar mal dagelassen, damit man die Textstelle leichter im Text findet.

Und ganz unten:
frame.addWindowListener(WindowListener listener) ;

Hier steht:
Diese Zeile enthält Mehrfachmarkierungen:
- Diese Stelle erfordert einen Hauptteil anstelle eines Semikolons (ich müsste also {} schreiben und da was mir unbekanntes einfügen?)
- Rückgabetyp für die Methode fehlt
- Syntaxfehler bei Token addWindowListener

Vielen Dank für die Hilfe.


----------



## Harry Kane (9. Okt 2014)

1. Bitte java-tags benutzen!!!
2. 
	
	
	
	





```
cRoot.jFrame.setVisible(false)
```
geht nur wenn cRoot ein öffentliches Feld mit Namen jframe hat. Hat es aber nicht. Wenn du cRoot sichtbar machen möchtest, warum nicht einfach

```
cRoot.setVisible(false)
```
3.
	
	
	
	





```
frame.addWindowListener(WindowListener listener)
```
 ist Kuddelmuddel. "frame.addWindowListener(" sieht so aus, also sollte es ein Methodenaufruf sein, aber "(WindowListener listener)" ist ein Parameterdeklaration im Methodenkopf!
Schreibe einfach irgendwo in deiner CafeRoot-Klasse, z. B. im Konstruktor, folgendes:

```
addWindowListener(new MyWindowListener(this));
```
und schmeiß die deine Kuddelmuddel-Zeile weg.
4. Nicht von JFrame ableiten, wenn du seine Funktionalität nicht erweiterterst, sondern ihn nur nutzt.


----------



## FranzFerdinand (10. Okt 2014)

Einen wunderschönen guten Tag,

vielen Dank für Deinen Beitrag. Entschuldige bitte das nichtverwenden von Javatags, wusste nicht, dass sowas existiert, hab deshalb immer nur CODE benützt. 

Das ist aktuell mein Programmcode:

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

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 09.10.2014
  * @author 
  */

public class CafeRoot extends JFrame {
  // Anfang Attribute
  private JLabel jLabelRestkartenTisch = new JLabel();
  private JLabel jLabelRestkartenGast = new JLabel();
  private JLabel jLabelRestbarplaetze = new JLabel();
  private JLabel jLabelHandkartenSpieler1 = new JLabel();
  private JLabel jLabelHandkartenSpieler2 = new JLabel();
  private JLabel jLabelPunkteSpieler1 = new JLabel();
  private JLabel jLabelPunkteSpieler2 = new JLabel();
  private JLabel jLabelSpieler = new JLabel();
  // Ende Attribute
  
  public CafeRoot(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
    int frameWidth = 500; 
    int frameHeight = 350;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    setTitle("Café International");
    
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    //Notiz: Denke an eine Abfrage, ob das Programm beendet werden solle!
    setLocationRelativeTo(null);
    cp.setLayout(null);
    
    // Anfang Komponenten
    int restkartentisch = 24;
    jLabelRestkartenTisch.setBounds(25, 10, 100, 30);
    jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
    cp.add(jLabelRestkartenTisch);
    //=============================
    int restkartengast = 100;
    jLabelRestkartenGast.setBounds(25, 35, 100, 30);
    jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
    cp.add(jLabelRestkartenGast);
    //=============================
    int restbarplaetze = 21;
    jLabelRestbarplaetze.setBounds(25, 60, 120, 30);
    jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
    cp.add(jLabelRestbarplaetze);
    //=============================
    int handkartenspieler1 = 0;//werden noch ausgeteilt
    jLabelHandkartenSpieler1.setBounds(25, 85, 140, 30);
    jLabelHandkartenSpieler1.setText("Karten Spieler 1: "+handkartenspieler1);
    cp.add(jLabelHandkartenSpieler1);
    //=============================
    int handkartenspieler2 = 0;
    jLabelHandkartenSpieler2.setBounds(25, 110, 140, 30);
    jLabelHandkartenSpieler2.setText("Karten Spieler 2: "+handkartenspieler2);
    cp.add(jLabelHandkartenSpieler2);
    //=============================
    int punktespieler1 = 0;
    jLabelPunkteSpieler1.setBounds(25, 135, 140, 30);
    jLabelPunkteSpieler1.setText("Pkt. Spieler 1: "+punktespieler1);
    cp.add(jLabelPunkteSpieler1);
    //=============================
    int punktespieler2 = 0;
    jLabelPunkteSpieler2.setBounds(25, 160, 140, 30);
    jLabelPunkteSpieler2.setText("Pkt. Spieler 2: "+punktespieler2);
    cp.add(jLabelPunkteSpieler2);
    //=============================
    int spieler = 1;
    jLabelSpieler.setBounds(25, 185, 140, 30);
    jLabelSpieler.setText("Am Zug: Spieler "+spieler);
    cp.add(jLabelSpieler);
    // Ende Komponenten
    
    setVisible(true);
    addWindowListener(new MyWindowListener(this));
  } // end of public CafeRoot
  
  // Anfang Methoden
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new CafeRoot("CafeRoot");
  } // end of main 
  public class MyWindowListener implements WindowListener {
	  
	  private CafeRoot cRoot;
	   
	  public MyWindowListener(CafeRoot cRoot) {
	          this.cRoot = cRoot;
	  }
	   
	  @Override
	  	public void windowActivated(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowClosed(WindowEvent arg0) {
	  		cRoot.setVisible(false);
	   //            was du noch machen willst
	  	}
	   
	  	@Override
	  	public void windowClosing(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowDeactivated(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowDeiconified(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowIconified(WindowEvent arg0) {
	   
	  	}
	   
	  	@Override
	  	public void windowOpened(WindowEvent arg0) {
	   
	  	}
	  }
} // end of class CafeRoot
```

Alle Fehlermeldungen sind weg, aber es passiert trotzdem rein gar nichts. Wenn ich auf Kreuz klicke schließt sich nichts und es kommt auch keine Meldung. Dass sich nichts schließt ist aufgrund von 

```
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```
ja auch logisch. Aber ich weiß jetzt nicht so Recht, was ich da ändern solle.

Gruß
Lukas


----------



## arilou (10. Okt 2014)

X5-599 hat gesagt.:


> ```
> // [...]
> @Override
> public void windowClosing(WindowEvent evt)
> ...


Du solltest z.B. X5-599's Code *auch einbauen*...
Was nützen Tipps und Ratschläge, wenn Du sie nicht verwendest?


----------



## FranzFerdinand (10. Okt 2014)

Hallo,

ja das hab ich auch gerade gesehen, da passiert ja an der Stelle gar nichts. Hab das jetzt so eingebaut. Vor den Code muss natürlich noch eine Zeile, die den Frame entsprechend einfügt, hab ich nun auch gemacht. 
da steht nun

```
@Override
		public void windowClosing(WindowEvent evt)
		{
	  		final JFrame f = new JFrame("Ein Frame zum Schließen");
			int auswahl = JOptionPane.showConfirmDialog(f, "Wirklich beenden?");
			if(auswahl == JOptionPane.YES_OPTION)
			{
				cRoot.dispose();
			}
		}
```

Ähm, ich hab gesehen, dass Du gerade Deinen Beitrag verändert hast. Der Code funktioniert auch. Ich habs nun nach der anderen Variante gemacht, klappt ja auch. 

Ich habe euch zu danken, für die nette Hilfe, auch wenn ich sehr stark Amateurmäßig da ran gegangen bin.
Es hilft ja auch nichts, wenn ihr mir hier ganze Codeschnipsel präsentiert und ich danach immer denke: Ach, verdammte Axt, jetzt funktioniert es, aber ich hab keine Ahnung, was da überhaupt gemacht wird.

Ich hab mir den Code angeguckt und verstehe ihn nun auch. 

Vielen Herzlichen Dank, das hilft mir eine ganze Ecke weiter.
Schönes Wochenende
FranzFerdinand

PS: mal so eine Frage. Ist das hier Gang und Gebe, dass man regelmäßig diesen Dankebutton drückt? Ich find das immer ein Wenig albern unter alles "Gefällt mir", +1, Danke schön oder sowas zu klicken, ich bedanke mich einfach und gut ist. Hab mal aus Höflichkeit und Dank überall Daumen hoch gedrückt. Gehört das hier zum Guten Umgang oder kann man das auch ausblenden?


----------



## FranzFerdinand (10. Okt 2014)

Sodele, entschuldigt die Störung, eine Frage hätte ich da noch, bezüglich der Kosmetik des Codes sowie des Fensters. 
Da steht jetzt Abbrechen, Ja und Nein. Abbrechen und Nein erfüllen ja so ziemlich den gleichen Zweck. Kann ich Abbrechen irgendwie wegstreichen? Der Code ist irgendwie so kurz, dass ich mir nicht erschließen kann, wieso das überhaupt da steht. Ich erkenne nur, welcher Befehl den Ja-Button erzeugt. Bzw. ähm 

```
showConfirmDialog
```
erzeugt wahrscheinlich gleich alle drei Buttons denk ich mal?


So sieht die Codestelle nun aus:

```
@Override
		public void windowClosing(WindowEvent evt)
		{
	  		final JFrame Beenden = new JFrame("Ein Frame zum Schließen");
	  		Beenden.setTitle("Programm beenden");
			int auswahl = JOptionPane.showConfirmDialog(Beenden, "Wollen Sie das Programm wirklich beenden?");
			if(auswahl == JOptionPane.YES_OPTION)
			{
				cRoot.dispose();
			}
		}
```

So und im Titel des kleinen neuen Fensters steht immer "Select an Option". Ich wollte das durch setTitle wie ihr sehen könnt abändern, aber da ändert sich nichts, steht immer noch da.
=====
Und wenn ich dann Ja auf Schließen klicke, schließt sich nur das Fenster, aber Java selbst bleibt unten in der Leiste. Das war sonst nie so. Wenn ich Fünf mal das Programm aufmache und über den Dialog schließe, hab ich am Ende fünf mal java offen.:shock:
--------
Das hab ich behoben bekommen.  System.exit(0); anstatt von dispose wirkt Wunder  
=====

Gruß
FranzFerdinand


----------



## Joose (10. Okt 2014)

FranzFerdinand hat gesagt.:


> Da steht jetzt Abbrechen, Ja und Nein. Abbrechen und Nein erfüllen ja so ziemlich den gleichen Zweck. Kann ich Abbrechen irgendwie wegstreichen?



Es gibt bei JOptionPane mehrere Möglichkeiten eine Dialog anzuzeigen, bei einem kann man auch festlegen welche Buttons angezeigt werden.

Abbrechen und Nein können schon eine unterschiedliche Bedeutung haben!
Frage: Wollen sie das Programm beenden ohne die Änderungen zu speichern?
Ja - Änderungen werden verworfen 
Nein - User die Möglichkeit geben die Änderungen zu speichern und dann wird das Programm geschlossen
Abbrechen - Dialog beenden und Programm nicht beenden

Was du aber machst bleibt natürlich dir überlassen.


----------



## FranzFerdinand (10. Okt 2014)

In meinem Zwecke sind Nein und Abbrechen, das gleiche, sonst hätte ich ja wohl nicht gefragt.
Ich hab nen feschen Wikiartikel zu dem Thema gefunden und konnte nun alle Probleme bewältigen!

So sieht es nun aus:

```
final JFrame Beenden = new JFrame("Ein Frame zum Schließen");
	  		Beenden.setTitle("Programm beenden");
	  		int beenden = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie das Programm wirklich beenden?\nIhr Spielstand wird verloren gehen!",
                    "Café International Beenden?",
                    JOptionPane.WARNING_MESSAGE,
                    JOptionPane.YES_NO_OPTION);
			if(beenden == JOptionPane.YES_OPTION)
			{
				//cRoot.dispose();
				System.exit(0);
			}
```

Vielen Dank und noch einen schönen Abend!

Bussy
FranzFerdinand


----------



## Joose (10. Okt 2014)

Das war mir schon klar, wollte dir aber eben ein Beispiel geben wie man hier doch zwischen diesen beiden Optionen unterscheiden kann.

Freut mich zu hören das nun alles klappt


----------



## FranzFerdinand (13. Okt 2014)

Ich möchte noch mal kurz Informieren, wie es aktuell aus sieht. Ich hab das nochmal schön umgeformt. Bisher hatte ich Einfach Ja oder Nein, falls ich irgendwie vor habe einen dritten Button einzubauen bin ich nun variabel.

```
Beenden.setTitle("Programm beenden");
      Object[] options = {"OK", "Cancel", "Ja", "Nein", "Egal"};
      int beenden = JOptionPane.showOptionDialog(null,
                                                 "Wollen Sie das Programm wirklich beenden?\nIhr Spielstand wird verloren gehen!",
                                                 "Café International Beenden?",
                                                 JOptionPane.DEFAULT_OPTION, 
                                                 JOptionPane.INFORMATION_MESSAGE, 
                                                 null, options, options[0]);
      if(beenden == 0)
      {
        //cRoot.dispose();
        System.exit(0);
      }
```

Der Ruft nun die Liste Options ab und ich kann dann in der If-bedingung einfach auf die Elemente zugreifen. Im Beispiel eben das 0te Element zum schließen.


----------

