WindowListener

Status
Nicht offen für weitere Antworten.

comp89

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

Code:
    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);
    }
 
B

bygones

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

K-Man

Bekanntes Mitglied
Damit du nicht alle Methode implementieren musst...
Code:
addWindowListener(new WindowHandler());

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

    }
}
 
B

bygones

Gast
oder als anonyme Klasse:
Code:
addWindowListener(new WindowAdapter() {
      public void WindowClosing(WindowEvent e) //Wird beim Schließen des Frames aufgerufen...
    { 
}
});
 

K-Man

Bekanntes Mitglied
@deathbyaclown:
Jetzt haben wir wohl alle Möglichkeiten abgedeckt und er kann sich jetzt eine Aussuchen ;)
 
B

bygones

Gast
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
Code:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setzen denn sonst bringt das ganze nix
 

K-Man

Bekanntes Mitglied
deathbyaclown hat gesagt.:
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
Code:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setzen denn sonst bringt das ganze nix
Hat er doch schon...nur bei seinem "alten" Programm hatte er es auskommentiert ;)
 

comp89

Bekanntes Mitglied
deathbyaclown hat gesagt.:
muss natürlich noch
Code:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setzen denn sonst bringt das ganze nix

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

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

Bekanntes Mitglied
aja und dann hab ich noch eine methode setLookAndFeel die auf
Code:
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

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

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

L-ectron-X

Gesperrter Benutzer
K-Man hat gesagt.:
Damit du nicht alle Methode implementieren musst...
Code:
addWindowListener(new WindowHandler());

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

    }
}
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:
Code:
//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

Bekanntes Mitglied
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
 
B

bygones

Gast
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
Code:
// 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
 
G

Guest

Gast
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

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

Bekanntes Mitglied
danke nochmal für eure antworten

es funzt zwar keine der zahlreichen möglichkeiten aber da kann man nix machen
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben