Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Action über rotes X in der Eke eines JFrames entscheiden.
RTFM-Frage: "add WindowListener()" -> Metode "windowClosing()"...
Obwohl die Funktion dieses "Buttons" Systemweit fest liegt, kann man hier zusätzliche Dinge ausführen.
RTFM-Frage: "add WindowListener()" -> Metode "windowClosing()"...
Obwohl die Funktion dieses "Buttons" Systemweit fest liegt, kann man hier zusätzliche Dinge ausführen.
Nicht nur zusätzliche: [HIGHLIGHT="Java"]frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);[/HIGHLIGHT]
Und dann kann der erwähnte WindowListener ganz alleine entscheiden was er tut.
Developer_X, vergiss nicht, dass der Nutzer eine Erwartungshaltung seinen Applikationen gegenüber hat. Wer da klickt, will ein Fenster schließen. Wenn das nicht funktioniert, ärgert sich der Benutzer in aller Regel.
ich will bevor das Programm beendet wird, einige INformationen speichern, bevor das Frame geschlossen wird, z.B.
die Frame Size, damit der User nächstes mal nicht das frame so ziehen muss, bis es ihm passt, verstehst du?
ok danke,
aber ich suche nach einem Weg,
mehrere Dinge tun zu können, nicht
EXIT_ON_CLOSE
oder sonstiges,
z.B.
System.out.println("");
System.exit(0);
das wie geht das?
ich will bevor das Programm beendet wird, einige INformationen speichern, bevor das Frame geschlossen wird, z.B.
die Frame Size, damit der User nächstes mal nicht das frame so ziehen muss, bis es ihm passt, verstehst du?
ok danke,
aber ich suche nach einem Weg,
mehrere Dinge tun zu können, nicht
EXIT_ON_CLOSE
oder sonstiges,
z.B.
System.out.println("");
System.exit(0);
das wie geht das?
Und besser als System.exit(0) ist es wohl, erst auf dem JFrame setVisible(false) aufzurufen, dann alles zu speichern und anschließend noch auf dem JFrame dispose(). System.exit terminiert alle Threads der aktuellen Applikation, wohingegen dispose() den JFrame "geordnet" beendet.
class MeinWindowListener extends WindowAdapter
{
public MeinWindowListener()
{
JFrame f = new JFrame();
f.setVisible(true);
}
public void WindowClosing(WindowEvent e) {
System.exit(0);
}
public static void main(String[]args)
{new MeinWindowListener();
}
}
Also du solltest die Klasse MeinWindowListener als innere Klasse einbauen. Sonst kannst du die Klasse gar nicht von JFrame ableiten, da Mehrfachvererbung in Java ja nicht erlaubt ist.
Hier ein kleines Beispiel, das ich bei meinen äteren Programmen gefunden habe. Der für dich interessante Teil ist rot markiert.
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//Fensterklasse definieren
public class CSwing_Beispiel extends JFrame {
JButton m_hänsel, m_und, m_gretel;
[color=red]
//Ereignisbehandlung für das Fenster
//Die Klasse CMeinWindowLauscher wird als innere Klasse eingebaut
class CMeinWindowLauscher extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
[/color]
//Ereignisbehandlung für die Steuerelemente
class CMeinActionLauscher implements ActionListener {
public void actionPerformed(ActionEvent e) {
int i;
m_hänsel.setText("verirten");
m_und.setText("und");
m_gretel.setText("Gretel");
}
}
//Der Konstruktor
CSwing_Beispiel(String titel) {
super(titel);
//Button-Instanzen erzeugen
m_hänsel = new JButton("Hänsel");
m_und = new JButton("und");
m_gretel = new JButton("Gretel");
//Layout-Manager zum Anordnen der Schalter
getContentPane().setLayout(new FlowLayout());
//Buttons in Fenster aufnehmen
getContentPane().add(m_hänsel);
getContentPane().add(m_und);
getContentPane().add(m_gretel);
//Frame bei einem WindowListener anmelden
addWindowListener(new CMeinWindowLauscher());
//Schalter bei ActionListener registrieren
m_hänsel.addActionListener(new CMeinActionLauscher());
m_und.addActionListener(new CMeinActionLauscher());
m_gretel.addActionListener(new CMeinActionLauscher());
}
public static void main(String[] args) {
CSwing_Beispiel Fenster = new CSwing_Beispiel("Swing");
Fenster.pack();
Fenster.setSize(300, 100);
Fenster.show();
}
}
Wie du siehst wird die Hauptklasse von JFrame abgeleitet.. sonst kannst du gar keinen JFrame erstellen. Um nun auch aus WindowAdapter ableiten zu können, machst du eine innere Klasse.