# WindowEvent beim Schließen eines JFrame



## dirty-mg (12. Feb 2008)

Hallo liebes Forum,

ich habe folgendes Fenster:


```
public class JFrame_Test {
    private JFrame_Test() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
            initGUI();
            this.setSize(new Dimension(1100, 800));
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    protected void processWindowEvent(WindowEvent e) {
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            // mache irgendwas ...
        }
    }
}
```

Dieses Fenster enthält einen JButton zum Schließen. Dieser macht folgendes:

```
this.setVisible(false);
```

Wenn ich das Fenster per Kreuz rechts oben schließe, wird die Methode "processWindowEvent" automatisch aufgerufen. Leider passiert das nicht, wenn ich den JButton benutze. Wie kann ich das Fenster mit dem Button schließen, dass ein entsprechendes WindowEvent ausgelöst wird??? 

Ich hab auch schon folgendes probiert (leider ohne Erfolg):

```
this.setVisible(false);
    this.dispose();
```

Wie kann man ein Fenster noch schließen???

Vielen Dank im Voraus.

mfg
Marcus


----------



## CyD (12. Feb 2008)

Ich bin mir nicht sicher ob ich dich richtig verstanden habe. ???:L 
Du willst, dass bei einem Klick auf einem Button und bei dem 
schließen des Fensters (rechts oben [x] ) die selbe Methode 
aufgerufen wird?

 :arrow: Wenn das stimmen sollte, schau dir dieses Beispiel mal an.

gruß
CyD


----------



## dirty-mg (13. Feb 2008)

Durch den Befehl 
	
	
	
	





```
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
```
 wird beim Schließen des Fensters automatisch durch Java die Methode 
	
	
	
	





```
processWindowEvent
```
 aufgerufen. Wie kann ich aber das Fenster über einen Button so schließen, dass auch ein WindowEvent ausgelöst wird?


----------



## The_S (13. Feb 2008)

Was macht denn die Methode "enableEvents(AWTEvent.WINDOW_EVENT_MASK);"?


----------



## Oli (13. Feb 2008)

Hallo


```
public class JFrame_Test extends JFrame{ 
  private JFrame_Test() { 
      enableEvents(AWTEvent.WINDOW_EVENT_MASK); 
      try { 
          initGUI(); 
          this.setSize(new Dimension(1100, 800)); 
          this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
      }catch (Exception ex) { 
          ex.printStackTrace(); 
      } 
  } 

  protected void processWindowEvent(WindowEvent e) { 
      if (e.getID() == WindowEvent.WINDOW_CLOSING) { 
          // mache irgendwas ... 
      } 
  } 
}
```


Dann klappt´s auch mit dispose();

Grüße Oli


----------



## dirty-mg (13. Feb 2008)

Klappt trotzdem nicht mit dispose(); Hast du es probiert? Wenn ich das Fenster per Button schließe, müsste doch auch ein WindowEvent ausgelöst werden?!


----------



## Oli (13. Feb 2008)

Hallo,

was willst du denn genau machen? Willst du beim Schließen des Fensters noch Aktionen durchführen oder willst du das Fenster einfach schließen?

Weil wenn ich den Button drücke und dispose() aufrufe schließt sich das Fenster. 

Die Frage ist eben jetzt, was du GENAU tun willst.

Grüße Oli


----------



## dirty-mg (13. Feb 2008)

Jedesmal wenn das Fenster geschlossen wird, soll noch was ausgeführt werden. Mein Problem ist nicht, das Fenster zu schließen, sondern nur ein WindowEvent ausgelöst wird, wenn ich das Fenster über das Kreuz schließe und nicht wenn ich es mit dispose() o.ä. schließe.


----------



## SlaterB (13. Feb 2008)

hmm, ich sehe das dispose() unabhängig von dem WindowEvent,
keine Ahnung wie es implementiert ist,

aber z.B. die Standard-Window-Event-Verarbeitung:

```
protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);

        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            switch(defaultCloseOperation) {
              case HIDE_ON_CLOSE:
                 setVisible(false);
                 break;
              case DISPOSE_ON_CLOSE:
                 setVisible(false);
                 dispose();
                 break;
              case DO_NOTHING_ON_CLOSE:
                 default: 
                 break;
	      case EXIT_ON_CLOSE:
                  // This needs to match the checkExit call in
                  // setDefaultCloseOperation
		System.exit(0);
		break;
            }
        }
    }
```
wenn hier bei dispose() ein neues WindowEvent erzeugt werden würde,
dann gäbe es doch eine Endlosschleife


wenn du in deinem WindowListener/ processWindowEvent() irgendwas machst,
dann stecke das in eine zweite Operation,
und diese rufst du genaus vor/ statt dispose() auf


----------



## Oli (13. Feb 2008)

Hallo,

also das funktioniert bei mir:


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import com.borland.jbcl.layout.VerticalFlowLayout;

public class Frame_Test extends JFrame implements WindowListener{

	public static void main(String[] args) {
		new Frame_Test();
	}
	
	public Frame_Test()
	{
		super();
		this.setLayout(new VerticalFlowLayout());
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		JButton test = new JButton("ENDE");
		test.addActionListener(myButtonEvent);
		this.add(test);
		this.addWindowListener(this);
		this.setVisible(true);
		this.pack();
	}
	
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void windowClosed(WindowEvent arg0) {
		System.out.println("Das ist vor dem Schließen passiert!");
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}

	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void windowOpened(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	private ActionListener myButtonEvent = new ActionListener() {

		public void actionPerformed(ActionEvent arg0) {
			dispose();
			
		}
		
	};
	
}
```


Grüße Oli


----------



## Oli (13. Feb 2008)

:wink: 

Les mal die Doku, wie die Events in Java behandelt werden ;-)

Grüße


----------



## dirty-mg (13. Feb 2008)

Vielen Dank soweit, ich denke, ich habe das problem jetzt gelöst.


----------



## Squicky (13. Feb 2008)

dirty-mg hat gesagt.:
			
		

> Vielen Dank soweit, ich denke, ich habe das problem jetzt gelöst.



Genau das gleiche Problem habe ich auch:
http://www.java-forum.org/de/viewtopic.php?p=384696#384696

Wie war deine Lösung?


----------



## dirty-mg (13. Feb 2008)

Das was beim Schließen passieren soll, schreibst Du in eine Funktion. Diese rufst Du dann im "windowClosing" auf und auch im "actionPerformed" des JButton. Ist zwar für mich noch nicht zufriedenstellend aber es funktioniert erstmal.


----------



## Oli (13. Feb 2008)

Hallo dirty-mg und Squicky

Schaut euch doch mal meine Lösung oben an. Diese funktioniert und ist auch praktikabel.

Wichtig ist eben, dass die setDefaultOnClose beim initilisieren des Frames erstmal auf DO_NOTHING_ON_CLOSE gesetzt wird. Und erst nach Ausführen des Codes auf DISPOSE_ON_CLOSE. 
Und wenn dann dispose aufgerufen wird, wird das Fenster geschlosssen.

Grüße Oli


----------



## Oli (13. Feb 2008)

public void windowClosed(WindowEvent arg0) { 
      System.out.println("Das ist vor dem Schließen passiert!"); 
      this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
      this.dispose();
   } 

this.dispose hat da noch gefehlt, sorry..

Grüße Oli


----------



## Squicky (13. Feb 2008)

Leider funktioniert das nicht.

Also:

Mein Daten_Frame habe ich selber erstellt:

```
public class JF_Daten_Frame extends JFrame
```

Dieser Daten_Frame Klasse habe ich dann deine Funktiuon hinzugefügt:

```
public void windowClosed(WindowEvent arg0) { 
      System.out.println("Das ist vor dem Schließen passiert!"); 
      this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
      this.dispose();
}
```

In den Constructor vom Daten_Frame habe ich dann hizugefügt:

```
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```

Wenn ich nun dispose() des Daten_Frame ausführe, verschwindet zwar, das Daten_Frame, aber sonst passiert nichts.


Schau mal hier: http://www.java-forum.org/de/viewtopic.php?p=384696#384696


----------



## Oli (13. Feb 2008)

Hi,


```
public class Frame_Test extends JFrame implements WindowListener
```

Sonst wird auf die windowClosing nicht reagiert. Bitte schaut euch Event-Handling an.
java.sun.com/docs/books/tutorial/uiswing/events/intro.html

Grüße Oli


----------



## Squicky (13. Feb 2008)

Also Oli,


Deine Lösung schein zu funktionieren, aber nur wenn wenn es ein Fram gibt.
Ich habe dein Code und dein Beispiel ( http://www.java-forum.org/de/viewtopic.php?p=384633#384633
 ) mit allen mir bekannten Möglichkeiten bei mir getestet: Es funktioniert nicht.


Wie wäre deine Lösung für folgende Sachlage:

Man hat ein Haupt_Frame mit einem Button. Wenn man diesen Button anklickt, soll ein zweites Frame geöffnet werden. Dieses Frame soll einen "abbrechen Button" haben. Wenn man das zweite Frame schließ in dem man oben rechts auf X klicken oder den "abbrechen Button" klicken, dann soll das Haupt_Frame darauf reakieren und z.B. die Hintergrundfarbe des Haupt_frame ändern.

Danke


----------



## Oli (13. Feb 2008)

Hallo,

jetzt hab ich es verstanden 
Gib mir bitte zwanzig Minuten, dann poste ich die Lösung.

Grüße Oli


----------



## Oli (13. Feb 2008)

Hallo,

so wie versprochen, ich hoffe das ist das was du suchst:


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.borland.jbcl.layout.VerticalFlowLayout;

public class Test_Frame implements ActionListener {

	public static void main(String[] args) {
		new Test_Frame();
	}
	JFrame haupt = new JFrame();
	JFrame f = new JFrame();

	private static final long serialVersionUID = 1L;

	public Test_Frame() {
		haupt = new JFrame();
		haupt.setLayout(new VerticalFlowLayout());
		haupt.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		JButton test = new JButton("Neues Fenster");
		test.addActionListener(this);
		test.setName("NEW");
		haupt.add(test);
		haupt.addWindowListener(hauptFrame);
		haupt.setVisible(true);
		haupt.setSize(new Dimension(300, 300));
	}

	public void generateSecondFrame() {
		f = new JFrame();
		f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		JButton test = new JButton("Schließen");
		test.setName("CLOSE");
		test.addActionListener(this);
		f.add(test);
		f.addWindowListener(f_Listener);
		f.setVisible(true);
		f.setSize(new Dimension(300, 300));
		f.setLocation(new Point(200, 400));
	}

	// Window and ActionListener methods
	private WindowListener f_Listener = new WindowListener() {
		public void windowActivated(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowClosed(WindowEvent arg0) {
			haupt.setBackground(Color.red);
			JPanel p = new JPanel();
			p.add(new JLabel("Jetzt ist Fenster 2 zu!!!!"));
			p.updateUI();
			haupt.add(p);
			haupt.validate();
			System.out.println("lala");


		}

		public void windowClosing(WindowEvent arg0) {
			f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			f.dispose();
		}

		public void windowDeactivated(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowDeiconified(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowIconified(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowOpened(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}
	};

	private WindowListener hauptFrame = new WindowListener() {
		public void windowActivated(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowClosed(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowClosing(WindowEvent arg0) {

		}

		public void windowDeactivated(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowDeiconified(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowIconified(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}

		public void windowOpened(WindowEvent arg0) {
			// TODO Auto-generated method stub

		}
	};

	public void actionPerformed(ActionEvent arg0) {
		if (arg0.getSource() instanceof JButton) {
			JButton temp = (JButton) arg0.getSource();
			if (temp.getName().equals("NEW")) {
				generateSecondFrame();
			}
			if (temp.getName().equals("CLOSE")) {
				f.dispose();
			}
		}

	}

}
```

Wenn nicht, schreib mir ne private Nachricht dann geb ich dir meine ICQ Nummer, dann können wir das live besprechen

Grüße Oli


----------

