Wie schließ ich ein Fenster RICHTIG! ?

Status
Nicht offen für weitere Antworten.

Indarija

Mitglied
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.

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

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

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

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
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
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 1
Gastfenster - Zeilen oben: 1
Gastfenster - Zeilen unmittelbar for der Schleife: 1
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 1
Gastfenster - Zeilen oben: 1
Gastfenster - Zeilen unmittelbar for der Schleife: 1
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
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0
Gastfenster - Zeilen unmittelbar for der Schleife: 0
FreundeFenster - geschloßen
Freundesliste wird geladen ...
Gastfenster - freund.Länge: 0
Gastfenster - Zeilen oben: 0

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

Indarija

Mitglied
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. :oops:
 
Zuletzt bearbeitet:

Indarija

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

Java:
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:

Java:
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 ....
 

Indarija

Mitglied
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
Gastfenster - Zeilen in der Schleife (Index: 6): 7
Freundesliste wird ausgegeben:
[
B ,
BR ,
dsdF ,
F ,
FG ,
G ,
SFG ]
Index:6
wurde gelöscht.
Die Feundesliste wurde gespeichert.

Gastfenster - Zeilen in der Schleife (Index: 5): 7
Freundesliste wird ausgegeben:
[
B ,
BR ,
dsdF ,
F ,
FG ,
G ]
Index:5
wurde gelöscht.
Die Feundesliste wurde gespeichert.

Gastfenster - Zeilen in der Schleife (Index: 2): 7
Freundesliste wird ausgegeben:
[
B ,
BR ,
dsdF ,
F ,
FG ]
Index:2
wurde gelöscht.
Die Feundesliste wurde gespeichert.

Gastfenster - Zeilen in der Schleife (Index: 1): 7
Freundesliste wird ausgegeben:
[
B ,
BR ,
F ,
FG ]
Index:1
wurde gelöscht.
Die Feundesliste wurde gespeichert.

Gastfenster - Zeilen in der Schleife (Index: 0): 7
Freundesliste wird ausgegeben:
[
B ,
F ,
FG ]
Index:0
wurde gelöscht.
Die Feundesliste wurde gespeichert.
// hier müsste schluss sein, aber er fängt noch eine Schleife an
FreundeFenster - geschloßen
Gastfenster - Zeilen unmittelbar for der Schleife: 7
Gastfenster - Zeilen in der Schleife (Index: 6): 7
Freundesliste wird ausgegeben:
[
F ,
FG ]
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 6, Size: 2

Also wird das wohl doch hierran liegen:
Java:
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 ...
 
Zuletzt bearbeitet:

Indarija

Mitglied
freund/FreundesListe.java:
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
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

Mitglied
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:

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

Michael...

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

Indarija

Mitglied
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. :oops:
 

Michael...

Top Contributor
Java:
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

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

Michael...

Top Contributor
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.
fenster/FreundeFenster.java
[JAVA=82]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.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);[/code]

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

Mitglied
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...

Top Contributor
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

Mitglied
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. :oops:

fenster/Button.java
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
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...

Top Contributor
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:
Java:
JButton newButton = new JButton("Löschen");
newButton.addActionListener(buttonFreundeLoeschen);
Zeile 137 muss dann ebenfalls ersetzt werden:
Java:
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

Mitglied
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. ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JFileChooser - dispose() - Fenster schließ. Abbrechen Button AWT, Swing, JavaFX & SWT 6
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
Tort-E JavaFX Fenster nachladen AWT, Swing, JavaFX & SWT 1
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
U Fenster beim Vergörßern immer quadratsich AWT, Swing, JavaFX & SWT 7
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3
G Scrollbar für das Fenster einfügen AWT, Swing, JavaFX & SWT 3
X Fenster von außen ansprechen AWT, Swing, JavaFX & SWT 7
brunothg Swing JTable -> AUTO_RESIZE_OFF aber das Fenster ausfüllen AWT, Swing, JavaFX & SWT 0
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben