Wie kann ein Swing WindowListener veto JFrame schließen
Ich habe ein frame und möchte auffordern, wenn der Benutzer es schließt, das Dokument zu speichern. Aber, wenn Sie Abbrechen, wird der frame nicht in der Nähe.
frame.addWindowListener(new SaveOnCloseWindowListener(fileState));
...
public class SaveOnCloseWindowListener extends WindowAdapter {
private final FileState fileState;
public SaveOnCloseWindowListener(FileState fileState) {
this.fileState = fileState;
}
public void windowClosing(WindowEvent e) {
if (!fileState.onQuit())
cancelClose();
}
}
FileState sieht, ob das Dokument fehlerhaft ist. Wenn es nicht, es tut nichts und liefert true. Wenn es schmutzig ist, es fragt den Benutzer, ob er speichern möchte (JA/NEIN/ABBRECHEN). Wenn der Benutzer bricht an diesem Punkt sollte es zum Abbruch der windowClosing.
Alle Vorschläge, die ich gesehen habe im Netz beinhalten explizit verlassen in die windowClosing-Methode, so überschreiben die Verwendung von JFrame.setDefaultCloseOperation(), und duplizieren Sie den code in JFrame.processWindowEvent().
Habe ich eigentlich eine dirty Lösung, aber würde gerne sehen, ob es irgendwelche Reiniger lieben.
Cheers
- mögliche Duplikate von Wie kann ich verhindern das schließen eines Java application
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den richtigen Weg gesetzt
JFrame.setDefaultCloseOperation
zuDO_NOTHING_ON_CLOSE
wenn das Fenster erstellt wird. Und dann einfach aufrufensetVisible(false)
oderdispose()
wenn Ihre Benutzer akzeptiert die in der Nähe, oder nichts zu tun, wenn die enge nicht akzeptiert.Ist der ganze Zweck des
JFrame.setDefaultCloseOperation
ist nur zu verhindern, dass die Notwendigkeit zur UmsetzungWindowListeners
für die meisten einfachen Aktionen. Die Handlungen, die diese Standard-schließen-Operationen sind sehr einfach.EDIT:
Habe ich die Lösung, die ich beschreibe. Dies setzt Voraus, Sie wollen die Rahmen werden komplett gelöscht.
setDefaultCloseOperation
auf die Schöpfung zu hindern, etwas zu tun. Und anstelle der Abbruch der schließen Sie explizit schließen Sie das Fenster, wenn Sie denken, es ist notwendig.Schließen einer Anwendung machen könnte, den Prozess ein wenig einfacher für Sie.
Ich denke, dies ist der logische Ausdruck der Thirler beantworten, und Art von dem, was ich versucht habe zu vermeiden.
Dank der Eingabe von Thirler und camickr. Dies ist meine Lösung, die ich sicher bin, dass einige hassen werden, aber vermeidet das duplizieren von Logik im JFrame, und erlaubt den client-code zu setDefaultCloseOperation wie gewohnt.