# Wie schließ ich ein Fenster RICHTIG! ?



## Indarija (17. Sep 2009)

*EDIT*: siehe bitte  Post #10.


Ich hab ein Problem und ich verstehe das Problem selber nicht so richtig. 

Mit meinem kleinem Programm kann man eine Freundesliste anlegen und einzelne Freunde wieder löschen. Doch wenn ich mehrere Freunde nach einander lösche .... :


> Freundesliste wird geladen ...
> Freund hinzugefügt.
> Sortiert.
> Die Feundesliste wurde gespeichert.
> ...



Wieso passiert das? Im Anhang befindet sich mein Programm. Ich hoffe, es kann mir jemand weiter helfen. ???:L


----------



## Michael... (17. Sep 2009)

Indarija hat gesagt.:


> Wieso passiert das?


Wieso passiert was???


----------



## Indarija (17. Sep 2009)

eigentlich müsste es so aussehen:
---
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 4
Gastfenster - Zeilen oben: 4
Gastfenster - Zeilen unmittelbar for der Schleife: 4
Gastfenster - Zeilen in der Schleife (Index: 3): 4
Index:3
wurde gelöscht.
Die Feundesliste wurde gespeichert.

FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 3
Gastfenster - Zeilen oben: 3
Gastfenster - Zeilen unmittelbar for der Schleife: 3
Gastfenster - Zeilen in der Schleife (Index: 2): 3
Index:2
wurde gelöscht.
Die Feundesliste wurde gespeichert.

FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 2
Gastfenster - Zeilen oben: 2
Gastfenster - Zeilen unmittelbar for der Schleife: 2
Gastfenster - Zeilen in der Schleife (Index: 1): 2
Index:1
wurde gelöscht.
Die Feundesliste wurde gespeichert.

FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 1
Gastfenster - Zeilen oben: 1
Gastfenster - Zeilen unmittelbar for der Schleife: 1
Gastfenster - Zeilen in der Schleife (Index: 0): 1
Index:0
wurde gelöscht.
Die Feundesliste wurde gespeichert.

FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
---
Eigentlich ist es ja ein Programm das man üder die grafische Oberfläche bedient. Und man sieht dann auch, dass das Fenster mit der Freundesliste mehrmals aufgerufen und geschlossen wird.


Edit:
Es fällt mich recht schwer das Problem zu beschreiben, weil ich das Problem nicht verstehe. Ich würde euch deshalb bitten, das Programm mal auszuprobieren.


----------



## Indarija (17. Sep 2009)

Also zuerst dachte ich, dass liegt an der Methode wie ich das Fenster schließe:


```
public  void schliessen(){
		try{
			f.dispose();
//			f = null;
			System.out.println("FreundeFenster - geschloßen");
		}catch (NullPointerException e){
			System.out.println("FreundeFenster - Fehler - NullPointerException");
		}
	}
```

Dann dachte ich, es liegt an der Methode des Button:


```
ActionListener buttonFreundeLoeschen = null;
			buttonFreundeLoeschen = new ActionListener() {
			     public void actionPerformed (ActionEvent e) {
			    	 try{
			    		 System.out.println("Gastfenster - Zeilen unmittelbar for der Schleife: " +zeilen);
			    		 //int i=zeilen; i>=0; i--
				    	for(int i=0; i<zeilen; i++){
				    		if(checkBox[i].isSelected() == true){
				    			System.out.println("Gastfenster - Zeilen in der Schleife (Index: " +i+ "): " +zeilen);
								freundliste.freundeLoeschen(i);
				    		}
				    	}
				 		Button.onFreundeLoeschen();
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
			     }
			};
	    Button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);
```

Aber jetzt weiß ich gar nichts mehr ....


----------



## Landei (17. Sep 2009)

Probiere mal for(int i=zeilen-1; i>=0; i--)


----------



## Indarija (17. Sep 2009)

Das ändert nichts. Das Problem ist immer noch das gleiche.


----------



## Indarija (17. Sep 2009)

Mir ist gard nochwas komisches aufgefallen:


> Freundesliste wird geladen ...
> Gastfenster - freund.Länge: 7
> Gastfenster - Zeilen oben: 7
> Gastfenster - Zeilen unmittelbar for der Schleife: 7
> ...



Also wird das wohl doch hierran liegen:

```
ActionListener buttonFreundeLoeschen = null;
			buttonFreundeLoeschen = new ActionListener() {
			     public void actionPerformed (ActionEvent e) {
			    	 try{
			    		 System.out.println("Gastfenster - Zeilen unmittelbar for der Schleife: " +zeilen);
				    	for(int i=zeilen-1; i>=0; i--){
				    		if(checkBox[i].isSelected() == true){
				    			System.out.println("Gastfenster - Zeilen in der Schleife (Index: " +i+ "): " +zeilen);
								freundliste.freundeLoeschen(i);
				    		}
				    	}
				 		Button.onFreundeLoeschen();
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
			     }
			};
	    Button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);
```

Ich versteh aber trotzdem nicht, warum es das macht ...


----------



## Landei (17. Sep 2009)

Hmmm, wie sieht denn deine Freundesliste-Klasse aus?


----------



## Indarija (17. Sep 2009)

freund/FreundesListe.java:

```
package freund;

import hilfsklassen.Konstanten;

import java.io.*;
import java.util.*;


public class FreundesListe implements Serializable {

	private static int freundanzahl = 0; 
	private static int gastanzahl = 0;
	private static List<Freund> freundesliste = new ArrayList<Freund>();
	private static List<Freund> gaesteliste = new ArrayList<Freund>();
	
	
	//Konstruktor
	public FreundesListe(){
				
	}
		
	public void neuerFreund(String vorname, String nachname, int alter, String email, String telefon, String handy) throws FileNotFoundException, IOException, ClassNotFoundException{
		ladenFreundesliste();
		freundesliste.add(new Freund(vorname, nachname, alter, email, telefon, handy));
		freundanzahl++;
	}
		
	public void speichernFreundesliste() throws FileNotFoundException, IOException{
	//	try{
			ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(Konstanten.FREUNDESLISTE));
			out.writeInt(freundesliste.size());                                            
				out.writeObject(freundesliste);
			System.out.println("Die Feundesliste wurde gespeichert.\n");
			out.close();
/*		}catch (FileNotFoundException e){
			System.out.println("FreundesListe - Fehler - FileNotFoundException");
		}catch (IOException e){
			System.out.println("FreundesListe - Fehler - IOException");
		}*/
	}		

	public void ladenFreundesliste() throws FileNotFoundException, IOException, ClassNotFoundException{
	//	try{
			System.out.println("Freundesliste wird geladen ...");
			ObjectInputStream in = new ObjectInputStream(new FileInputStream (Konstanten.FREUNDESLISTE));
		
			freundanzahl = in.readInt();
			freundesliste = (List<Freund>) in.readObject();
			in.close();
//			System.out.println("Anzahl: " +freundesliste.size());
/*		}catch(OptionalDataException e){
			System.out.println("Keine Gastanzahl vorhaden.");
		}catch(FileNotFoundException e){
			System.out.println("FreundesListe - Achtung - Die Datei wurde nicht gefunden.");
			ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(Konstanten.FREUNDESLISTE));
			System.out.println("FreundesListe - Achtung - Die Datei wurde erstetzt.");
		}catch (EOFException e){
			System.out.println("FreundesListe - Fehler - Es gab Probleme beim Laden der Datei.");
			System.out.println("FreundesListe - Fehler - Es muss eine neue Datei angelegt werden.");
		}catch (IOException e){
			System.out.println("FreundesListe - Fehler - IOException");
		}catch (ClassNotFoundException e){
			System.out.println("FreundesListe - Fehler - ClassNotFoundException");
		}		*/
	}
	
	public void lesen(){
		System.out.println("Freundesliste wird ausgegeben:");
		System.out.println(freundesliste);
	}
	
	public void sortieren(){
		int laenge = freundesliste.size();
		Object[] gast = freundesliste.toArray();
		freundesliste.clear();
		for(int i=0; i<laenge; i++){
			String eintrag1 = ((Freund)gast[i]).getName();
			for(int j=0; j<laenge; j++){
				String eintrag2 = ((Freund)gast[j]).getName();
				int vergleich = eintrag1.compareToIgnoreCase(eintrag2);
				if ( vergleich < 0 ){
					Freund hilfe = (Freund)gast[i];
					gast[i] = (Freund)gast[j];
					gast[j] = hilfe;
				}
			}
		}	
		for(int i=0; i<laenge; i++){
//			System.out.println("Eintrag1: " +((Gast)gast[i]).getName()+ " wird gespeichert.");
			freundesliste.add((Freund)gast[i]);
		}
		System.out.println("Sortiert.");
	} 
	
	public Object[] getFreundesliste(){
		Object[] gast = freundesliste.toArray();
		return gast;
	}

	public void neuerFreundInListe(String vorname, String nachname, int alter, String email, String telefon, String handy) throws FileNotFoundException, IOException, ClassNotFoundException {
		neuerFreund(vorname, nachname, alter, email, telefon, handy);
		sortieren();
		speichernFreundesliste();	
	}


	public void freundeLoeschen(int i) throws IOException, ClassNotFoundException {
//		try{
			lesen();
			freundesliste.remove(i);
			System.out.println("Index:" +i);
			System.out.println(/*freundesliste.get(i)+ */" wurde gelöscht.");
			speichernFreundesliste();
/*		}catch (NullPointerException e){
			System.out.println("FreundesListe - Achtung - NullPointerException");
		}catch (IndexOutOfBoundsException e){
			System.out.println("FreundesListe - Achtung - IndexOutOfBoundsException");
		}
	*/	
	}

	public void freundeAufGaesteliste(int i) {
		gaesteliste.add(freundesliste.get(i));
		
	}
	
	public void speichernGaesteliste() throws FileNotFoundException, IOException{
		ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(Konstanten.GAESTELISTE));
		out.writeInt(gaesteliste.size());                                            
			out.writeObject(gaesteliste);
		System.out.println("Die Gästeliste wurde gespeichert.\n");
		out.close();
	}
	
	public void ladenGaesteliste() throws FileNotFoundException, IOException, ClassNotFoundException{
//		try{	
			System.out.println("Gästeliste wird geladen ...");
			ObjectInputStream in = new ObjectInputStream(new FileInputStream (Konstanten.GAESTELISTE));
			gastanzahl = in.readInt();
			gaesteliste = (List<Freund>) in.readObject();
			in.close();
/*		}catch(OptionalDataException e){
			System.out.println("Keine Gastanzahl vorhaden.");
		}catch (EOFException e){
			System.out.println("FreundesListe - Fehler: Es ist ein Fehler beim Speichern aufgetreten.");
		}catch (FileNotFoundException e){
			System.out.println("FreundesListe - Fehler: Es ist ein Fehler beim Speichern der Gästeliste aufgetreten. Die Datei kann nicht geladen werden");
		}
	*/	
	}
	
	public Object[] getGastanzahlListe() throws FileNotFoundException, IOException, ClassNotFoundException {
		ladenGaesteliste();
		Object[] gast = gaesteliste.toArray();
		return gast;
	}
}
```

und was wohl interessanter ist:
fenster/FreundeFenster.java

```
package fenster;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.*;

import freund.Freund;
import freund.FreundesListe;


public class FreundeFenster extends JFrame {

	private  JFrame f;
	private JCheckBox[] checkBox;
	final private FreundesListe freundliste = new FreundesListe();	
	private int spalten = 250;
	private int zeilen;
	private int gastanzahl = 0;
	
	private static int [] verzweiflung = new int[200];
	
	//Konstruktor
	public FreundeFenster() {
		
		
	}
	
	public void oeffneFenster() throws FileNotFoundException, IOException, ClassNotFoundException {
		f = new JFrame("Freundesliste");
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		//abgespeicherte Liste laden
		freundliste.ladenFreundesliste();
		final Object[] freund = freundliste.getFreundesliste();
		zeilen = freund.length;
		System.out.println("Gastfenster - freund.Länge: " +freund.length);
		System.out.println("Gastfenster - Zeilen oben: " +zeilen);
		
		f.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.insets = new Insets (5,5,5,5);
		c.anchor = GridBagConstraints.WEST;
		c.gridwidth = GridBagConstraints.REMAINDER;
		c.fill = GridBagConstraints.HORIZONTAL;
		
		JLabel text1 = new JLabel("Freundesliste:");
		f.add(text1,c);
					
		// Freundesliste auflisten
		checkBox = new JCheckBox[zeilen];
	
		for(int i=0; i<zeilen; i++){
//			System.out.println("Gastfenster - Checkliste füllen: " +i);
			checkBox[i] = new JCheckBox (((Freund)freund[i]).toString());
			spalten = breiteBerechnen(((Freund)freund[i]).toString().length());
//			System.out.println("Gastfenster - Checkliste einsetzen: " +i);
			f.add(checkBox[i],c);
		}	
		
		ActionListener buttonOKListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	        	 Button.onListeOK();
	         }
		};
		Button.listeOK.addActionListener (buttonOKListener);

	    ActionListener buttonAbbrechenListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	            Button.onAbbrechenListe();
	         }
	    };
	    Button.abbrechenListe.addActionListener (buttonAbbrechenListener);
	    
	    ActionListener buttonFreundeLoeschen = null;
			buttonFreundeLoeschen = new ActionListener() {
			     public void actionPerformed (ActionEvent e) {
			    	 try{
			    		 System.out.println("Gastfenster - Zeilen unmittelbar for der Schleife: " +zeilen);
				    	for(int i=zeilen-1; i>=0; i--){
				    		if(checkBox[i].isSelected() == true){
				    			System.out.println("Gastfenster - Zeilen in der Schleife (Index: " +i+ "): " +zeilen);
								freundliste.freundeLoeschen(i);
				    		}
				    	}
				 		Button.onFreundeLoeschen();
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
			     }
			};
	    Button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);
	    
	    ActionListener buttonFreundeEinladen = new ActionListener(){
		    	public void actionPerformed (ActionEvent e){
		    		try {
			    		for(int i=0; i<zeilen; i++){
				    		if(checkBox[i].isSelected() == true){
				    			freundliste.freundeAufGaesteliste(i);
				    			gastanzahl++;
				    		}
			    		}
						freundliste.speichernGaesteliste();
						if(gastanzahl == 0){
							JOptionPane.showMessageDialog (null, "Du hast keine Gäste ausgesucht!", "Fehlender Name", JOptionPane.ERROR_MESSAGE);
						}else{
							Button.onFreundeEinladen();
		    			}
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
		    	}
	    };
	    Button.freundeEinladen.addActionListener (buttonFreundeEinladen); 
	    
	    f.add(Button.abbrechenListe,c);
	    f.add(Button.freundeEinladen,c);
	    f.add(Button.freundeLoeschen,c);
		
		f.setVisible(true);
		f.setSize(spalten,zeilen*35+170);
	}

	private int breiteBerechnen(int breite) {
		if(spalten < breite){
			return breite;
		}
		return spalten;
	}

	/*
	public static void oeffnen(){
		f.setVisible(true);
	}
	*/
	public  void schliessen(){
		try{
			f.dispose();
//			f = null;
			System.out.println("FreundeFenster - geschloßen");
		}catch (NullPointerException e){
			System.out.println("FreundeFenster - Fehler - NullPointerException");
		}
	}		
	
	

}
```


----------



## Indarija (17. Sep 2009)

Ich hab noch ein paar Test gemacht. Es liegt nicht an der Schleife. Es liegt daran, dass im Hintergrund mehrere Freundeslisten laufen und mir das Programm zerschießen. Ich schließe sie nicht richtig. Was hab ich da nur vergessen:


```
public  void schliessen(){
		try{
			f.dispose();
			System.out.println("FreundeFenster - geschloßen");
		}catch (NullPointerException e){
			System.out.println("FreundeFenster - Fehler - NullPointerException");
		}
	}
```


----------



## Michael... (18. Sep 2009)

Deine Vorgehensweise ist irgendwie merkwürdig. Warum verwendest Du nich ein einziges Frame/Dialog zum Darstellen der "Freundeslisten"?


----------



## Indarija (18. Sep 2009)

Mach ich das nicht?

Ich verwende doch durchgehend "JFrame f;"
mit dem Layout "GridBagConstraints c = new GridBagConstraints();"


Ich programmiere zum erstem Mal mit Swing. So richtig hab ich den Dreh anscheinend nicht raus.


----------



## Michael... (18. Sep 2009)

Indarija hat gesagt.:


> ```
> public void oeffneFenster() throws ... {
> f = new JFrame("Freundesliste");
> ```


Bei jedem Aufruf von oeffneFenster() erzeugst Du den Frame mit all seinen Komponenten neu. Ausserdem erbt Deine FreundeKlasse von JFrame benutzt aber garnichts davon.

Muss zwar nicht bedeuten, dass das daran liegt. Aber allgemein ist es schwer bei Deinem Code durchzusteigen.


----------



## Indarija (18. Sep 2009)

Wenn ich es aber oben inizialisiere, zerschießt es mir mein Layout. Und an dem Problem ändert sich auch nichts.


----------



## Michael... (18. Sep 2009)

So, habe mir das ganze mal ein bisschen genauer angeschaut und festgestellt, dass hinter Button.freundeLoeschen (Zeile 103) eine statische Variable steckt. Das hat zur Konsequenz (da Du jedes mal alles - bis auf die statischen Komponenten - neu erzeugst), dass dem selben Button bei jedem neuen Anzeigen des Frames aus FreundeFenster ein neuer ActionListener buttonFreundeLoeschen zugewissen wird (Zeile 103). Ergo potenzieren sich bei jedem Löschvorgang die Listener, die an dem Button hängen.


Indarija hat gesagt.:


> fenster/FreundeFenster.java
> [JAVA=82]ActionListener buttonFreundeLoeschen = null;
> buttonFreundeLoeschen = new ActionListener() {
> public void actionPerformed (ActionEvent e) {
> ...


_
Bitte nicht übel nehmen, aber im  allgemeinen ist Dein Code ganz schon schwer zu verdauen.:bahnhof: Solltest Dir vielleicht mal solche Dinge wie das Model View Controller Konzept anschauen.
Ausserdem ist Java eine objektorientierte Sprache, statische Methodenaufrufe und statische Variablen sollte man nur gezielt einsetzen._


----------



## Indarija (19. Sep 2009)

Ich danke dir, dass du dich mit meinem Problem auseinander gesetzt hast. Es ist wirklich eine schlechte Angewohnheit von mir zu viele statische Methoden und Variablen zu benutzten, das muss ich mir abgewöhnen. 

Das Problem der mehreren Fenster im Hintergrund löst es aber nicht.  

Ich habe es aufgegeben dieses Problem zu beheben. Ich hab das Programm so umprogrammiert, dass der Fehler das Programm nicht weiter kaputt macht. Ist zwar blöd, aber jedenfalls läuft es.


----------



## Michael... (21. Sep 2009)

Indarija hat gesagt.:


> Das Problem der mehreren Fenster im Hintergrund löst es aber nicht.


 Wie hast Du es denn versucht zu lösen? Es liegt hunderprozentig daran, dass Du einem Button mit jedem neuen Anzeigen eines Fensters einen weiteren Listener anhängst - und das nicht nur bei dem Löschen Button sondern bei allen!!!
Versuch doch einfach mal innerhalb der *oeffneFenster()* Methode einen neuen Button zu initialisieren und diesen anstelle von *Button.freundeLoeschen* zu verwenden... und Du wirst sehen, diese Mehrfach-Fenster-Geschichte hat sich erledigt.

Aber wie gesagt, diese Geschichte betrifft alle Deine Buttons aus der Button-Klasse. Daher würde ich das ganze Konzept nochmals überdenken.


----------



## Indarija (21. Sep 2009)

Ich versteh nicht ganz, was ich deiner Meinung nach überarbeiten muss. Ich hab "static" aus allen Button-Methoden raus genommen. Aber das Problem ist geblieben.

Hab ich da irgendwas falsch verstanden? Vielleicht kannst du mir ein Codeschnippel zeigen. 

fenster/Button.java

```
ActionListener buttonOKListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	        	 button.onListeOK();
	         }
		};
		button.listeOK.addActionListener (buttonOKListener);

	    ActionListener buttonAbbrechenListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	            button.onAbbrechenListe();
	         }
	    };
	    button.abbrechenListe.addActionListener (buttonAbbrechenListener);
	    
	    ActionListener buttonFreundeLoeschen = null;
			buttonFreundeLoeschen = new ActionListener() {
			     public void actionPerformed (ActionEvent e) {
			    	 try{
//			    		 System.out.println("FreundeFenster - Zeilen unmittelbar for der Schleife: " +zeilen);
				    	for(int i=zeilen-1; i>=0; i--){
				    		if(checkBox[i].isSelected() == true){
//				    			System.out.println("FreundeFenster - Zeilen in der Schleife (Index: " +i+ "): " +zeilen);
								freundliste.freundeLoeschen(i);
				    		}
				    	}
				 		button.onFreundeLoeschen();
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
			     }
			};
	    button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);
	    
	    ActionListener buttonFreundeEinladen = new ActionListener(){
		    	public void actionPerformed (ActionEvent e){
		    		try {
		    			freundliste.gaestelisteLeeren();
			    		for(int i=0; i<zeilen; i++){
				    		if(checkBox[i].isSelected() == true){
				    			freundliste.freundeAufGaesteliste(i);
				    			gastanzahl++;
				    		}
			    		}
						freundliste.speichernGaesteliste();
						if(gastanzahl == 0){
							JOptionPane.showMessageDialog (null, "Du hast keine Gäste ausgesucht!", "Fehlender Name", JOptionPane.ERROR_MESSAGE);
						}else{
							button.onFreundeEinladen();
		    			}
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
		    	}
	    };
	    button.freundeEinladen.addActionListener (buttonFreundeEinladen);
```

fenster/FreundeFenster.java

```
package fenster;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.*;

import freund.Freund;
import freund.FreundesListe;


public class FreundeFenster extends JFrame {

	private static JFrame f ;
	private JCheckBox[] checkBox;
	final private FreundesListe freundliste = new FreundesListe();
	private Button button = new Button();
	
	private int spalten = 250;
	private int zeilen;
	private int gastanzahl = 0;

	
	
	//Konstruktor
	public FreundeFenster() {
		
		
	}
	
	public void oeffneFenster() throws FileNotFoundException, IOException, ClassNotFoundException {
		f = new JFrame("Freundesliste");
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		//abgespeicherte Liste laden
		freundliste.ladenFreundesliste();
		final Object[] freund = freundliste.getFreundesliste();
		zeilen = freund.length;
//		System.out.println("FreundeFenster - freund.Länge: " +freund.length);
//		System.out.println("FreundeFenster - Zeilen oben: " +zeilen);
		
		f.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.insets = new Insets (5,5,5,5);
		c.anchor = GridBagConstraints.WEST;
		c.gridwidth = GridBagConstraints.REMAINDER;
		c.fill = GridBagConstraints.HORIZONTAL;
		
		JLabel text1 = new JLabel("Freundesliste:");
		f.add(text1,c);
					
		// Freundesliste auflisten
		checkBox = new JCheckBox[zeilen];
	
		for(int i=0; i<zeilen; i++){
//			System.out.println("FreundeFenster - Checkliste füllen: " +i);
			checkBox[i] = new JCheckBox (((Freund)freund[i]).toString());
			spalten = breiteBerechnen(((Freund)freund[i]).toString().length());
//			System.out.println("FreundeFenster - Checkliste einsetzen: " +i);
			f.add(checkBox[i],c);
		}	
		
		//Buttons
		ActionListener buttonOKListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	        	 button.onListeOK();
	         }
		};
		button.listeOK.addActionListener (buttonOKListener);

	    ActionListener buttonAbbrechenListener = new ActionListener() {
	         public void actionPerformed (ActionEvent e)
	         {
	            button.onAbbrechenListe();
	         }
	    };
	    button.abbrechenListe.addActionListener (buttonAbbrechenListener);
	    
	    ActionListener buttonFreundeLoeschen = null;
			buttonFreundeLoeschen = new ActionListener() {
			     public void actionPerformed (ActionEvent e) {
			    	 try{
//			    		 System.out.println("FreundeFenster - Zeilen unmittelbar for der Schleife: " +zeilen);
				    	for(int i=zeilen-1; i>=0; i--){
				    		if(checkBox[i].isSelected() == true){
//				    			System.out.println("FreundeFenster - Zeilen in der Schleife (Index: " +i+ "): " +zeilen);
								freundliste.freundeLoeschen(i);
				    		}
				    	}
				 		button.onFreundeLoeschen();
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
			     }
			};
	    button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);
	    
	    ActionListener buttonFreundeEinladen = new ActionListener(){
		    	public void actionPerformed (ActionEvent e){
		    		try {
		    			freundliste.gaestelisteLeeren();
			    		for(int i=0; i<zeilen; i++){
				    		if(checkBox[i].isSelected() == true){
				    			freundliste.freundeAufGaesteliste(i);
				    			gastanzahl++;
				    		}
			    		}
						freundliste.speichernGaesteliste();
						if(gastanzahl == 0){
							JOptionPane.showMessageDialog (null, "Du hast keine Gäste ausgesucht!", "Fehlender Name", JOptionPane.ERROR_MESSAGE);
						}else{
							button.onFreundeEinladen();
		    			}
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
		    	}
	    };
	    button.freundeEinladen.addActionListener (buttonFreundeEinladen); 
	    
	    f.add(button.abbrechenListe,c);
	    f.add(button.freundeEinladen,c);
	    f.add(button.freundeLoeschen,c);
		
	    //sichtbar machen
		f.setVisible(true);
		f.setSize(spalten,zeilen*35+170);
	}

	private int breiteBerechnen(int breite) {
		if(spalten < breite){
			return breite;
		}
		return spalten;
	}

	/*
	public static void oeffnen(){
		f.setVisible(true);
	}
	*/
	public  void schliessen(){
		f.dispose();
		System.out.println("FreundeFenster - geschloßen");
	}
}
```


----------



## Michael... (21. Sep 2009)

Das Problem liegt jetzt nicht direkt am static, sondern daran, dass Du bei jedem Öffnen ein neues Fenster und einen neuen ActionListener erzeugst aber immer wieder den selben Button verwendest, dem Du den neuen ActionListener zuweist, während die alten Listener weiterhin gültig bleiben. --> Bei einer längeren Nutzung wird das irgendwann auf einen Stackoverflow hinauslaufen
Du kannst ja mal provisorisch folgende Zeile der Klasse FreundeFenster:   
[JAVA=106]button.freundeLoeschen.addActionListener (buttonFreundeLoeschen);[/code]
mit folgendem ersetzen:

```
JButton newButton = new JButton("Löschen");
newButton.addActionListener(buttonFreundeLoeschen);
```
Zeile 137 muss dann ebenfalls ersetzt werden:

```
f.add(newButton, c);
```

Prinizipiell solltest Du aber Dein Konzept überdenken (s. Bsp. MVC), da es ja nicht unbedingt Sinn macht, bei jeder Aktion ein neues Fenster zu erzeugen.

Und nochmals der Hinweis: Diese Problematik betrifft so ziemlich alle  Deine Buttons.


----------



## Indarija (21. Sep 2009)

Du hast recht! Jetzt läuft es wie es soll. DANKE DANKE DANKE !!! :toll:

Das mit dem Konzept werde ich mir auch noch durch den Kopf gehen lassen.


----------

