# WindowListener



## comp89 (8. Jun 2004)

hi
ich möcte gern mit einem java.awt.event.WindowListener oder sowas das Drücken des X im Frame also Schließen abfangen meine fragen sind 
1. stimmt das
2. was muss ich der methode übergeben
3. wo ruf ich diese methode auf


```
TicTacToe(){
        super(spieler1+" ist dran");
        setSize(260, 260);
        // das war mein alter code : setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        JPanel panel = new JPanel();
        felder[0].addActionListener(this);
        felder[1].addActionListener(this);
        felder[2].addActionListener(this);
        felder[3].addActionListener(this);
        felder[4].addActionListener(this);
        felder[5].addActionListener(this);
        felder[6].addActionListener(this);
        felder[7].addActionListener(this);
        felder[8].addActionListener(this);
        GridLayout gl = new GridLayout(3, 3, 10, 10);
        panel.add(felder[0]);
        panel.add(felder[1]);
        panel.add(felder[2]);
        panel.add(felder[3]);
        panel.add(felder[4]);
        panel.add(felder[5]);
        panel.add(felder[6]);
        panel.add(felder[7]);
        panel.add(felder[8]);
        addWindowListener(this); // Frage
        setContentPane(panel);
        setVisible(true);
    }
```


----------



## bygones (8. Jun 2004)

```
addWindowListener(this)
```
stimmt dann, wenn deine Klasse das Interface WindowListener implementiert oder von der Klasse WindowAdapter erbt.


----------



## K-Man (8. Jun 2004)

Damit du nicht alle Methode implementieren musst...

```
addWindowListener(new WindowHandler());

[...]
class WindowHandler extends WindowAdapter
{
    public void WindowClosing(WindowEvent e) //Wird beim Schließen des Frames aufgerufen...
    {

    }
}
```


----------



## bygones (8. Jun 2004)

oder als anonyme Klasse:

```
addWindowListener(new WindowAdapter() {
      public void WindowClosing(WindowEvent e) //Wird beim Schließen des Frames aufgerufen...
    { 
}
});
```


----------



## K-Man (8. Jun 2004)

@deathbyaclown:
Jetzt haben wir wohl alle Möglichkeiten abgedeckt und er kann sich jetzt eine Aussuchen


----------



## bygones (8. Jun 2004)

K-Man hat gesagt.:
			
		

> @deathbyaclown:
> Jetzt haben wir wohl alle Möglichkeiten abgedeckt und er kann sich jetzt eine Aussuchen


nicht ganz ;-)

muss natürlich noch 
	
	
	
	





```
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```
setzen denn sonst bringt das ganze nix


----------



## K-Man (8. Jun 2004)

deathbyaclown hat gesagt.:
			
		

> K-Man hat gesagt.:
> 
> 
> 
> ...


Hat er doch schon...nur bei seinem "alten" Programm hatte er es auskommentiert


----------



## comp89 (8. Jun 2004)

deathbyaclown hat gesagt.:
			
		

> muss natürlich noch
> 
> 
> 
> ...



muss ich das jetzt wirklich machen oder war das ironisch gemeint?

Eigentlich wollt ich damit abfangen, das man während des Spiels schließt und ich wollt nicht

```
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```
schreiben, weil dann passiert ja nix wenn man schließen will und das ist blöd. jetzt hab ich einen messagedialog gemacht, aber der wird mir nicht angezeigt, wenn ich auf schließen klick.
schauts euch den code bitte noch mal an:


```
TicTacToe(){
        super(spieler1+" ist dran");
        setSize(260, 260);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        JPanel panel = new JPanel();
        feld1.addActionListener(this);
        feld2.addActionListener(this);
        feld3.addActionListener(this);
        feld4.addActionListener(this);
        feld5.addActionListener(this);
        feld6.addActionListener(this);
        feld7.addActionListener(this);
        feld8.addActionListener(this);
        feld9.addActionListener(this);
        GridLayout gl = new GridLayout(3, 3, 10, 10);
        panel.setLayout(gl);
        panel.add(feld1);
        panel.add(feld2);
        panel.add(feld3);
        panel.add(feld4);
        panel.add(feld5);
        panel.add(feld6);
        panel.add(feld7);
        panel.add(feld8);
        panel.add(feld9);
        addWindowListener(new WindowAdapter(){
            public void WindowClosing(WindowEvent e){
                JOptionPane.showMessageDialog(null, "Während des Spiels kannst du nicht beenden!", "GEHT NICHT", JOptionPane.ERROR_MESSAGE);
            }
        });
        setContentPane(panel);
        setVisible(true);
    }
```


----------



## comp89 (8. Jun 2004)

aja und dann hab ich noch eine methode setLookAndFeel die auf

```
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
```
setzt damit alles im windowssyle is und das is bei allen messagedialogs und inputdialogs und auch bei einem zweiten frames im windowsstyle nur beim grad besprochenen jframe gehts nicht
weiß jemand von euch vielleicht wo das problem is?


----------



## K-Man (8. Jun 2004)

```
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```
Du musst das schon schreiben. Damit sagst du mehr oder weniger, dass du das Schließen des Programms selber regeln willst. (zB mit dem WindowListener...)


----------



## comp89 (8. Jun 2004)

danke für deine antwort aber der messagedialog kommt trotzdem nicht und eben der jframe is in ganz normalem metal-style


----------



## L-ectron-X (8. Jun 2004)

K-Man hat gesagt.:
			
		

> Damit du nicht alle Methode implementieren musst...
> 
> ```
> addWindowListener(new WindowHandler());
> ...


Damit man nicht alle Methoden implementieren muss, gibt es eine "Bequemlichkeitsklasse", den WindowAdapter. Eine Ableitung von ihr ist nicht unbedingt nötig, da sie nur aus leeren Methodenrümpfen besteht, die aus dem WindowListener-Interface überschrieben wurden.
Eine ausformulierte Version:

```
//im Konstruktor der Fenster-Klasse
addWindowListener(new WindowAdatper) {
  public void windowClosing(WindowEvent e) {
    setVisible(false);
    dispose();
  }
});
```



> UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());


Ich glaube, diese Zeile muss ganz als erstes im Konstruktor stehen, noch vor der Erzeugung von Components.


----------



## comp89 (8. Jun 2004)

ja aber ich will ja nicht dass er schließt

und das mit dem UI-Manager: vorher also bevor ich das mit dem windowlistener gemacht hab is es auch gegangen, ich ruf die Methode setLookAndFeel aus der main-Methode auf (als erstes) und dann erst mach ich den rest und wie schon gesagt, bei den anderen frames im selben projekt gehts auch


----------



## bygones (8. Jun 2004)

in die methode windowlistener musst du dann halt schreiben was du willst. solange du da nciht den frame bzw. programm komplett beendest passiert auch nichts.

wg.looknfeel... komisch - normaler weise reicht es wenn du per 

```
// the look and feel is set to the plastic look and feel
UIManager.setLookAndFeel(new PlasticLookAndFeel());
```
das LooknFeel am Anfang bevor du irgendeine Komponente anzeigst setzt... das sollte dann für alle komponenten gelten


----------



## Guest (8. Jun 2004)

es funzt aber nicht es kommt einfach mein messagedialog nicht wenn ich schließen will und mit dem lnf beschäftig ich mich dann wieda am abend
danke daweil


----------



## K-Man (8. Jun 2004)

```
addWindowListener(new WindowHandler());

[...]
class WindowHandler extends WindowAdapter
{
    public void WindowClosing(WindowEvent e) //Wird beim Schließen des Frames aufgerufen...
    {
        exitApplication();
    }

    private void exitApplication()
    {
        showDialog();
    }
}
```


----------



## comp89 (8. Jun 2004)

danke nochmal für eure antworten

es funzt zwar keine der zahlreichen möglichkeiten aber da kann man nix machen


----------

