Show prompt before closing JFrame
I wish to prompt user input, before we really quit the app. So far, the following technique works fine for JFrame
.
public class JavaApplication1 extends javax.swing.JFrame {
public JavaApplication1() {
this.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
}
private void formWindowClosing(java.awt.event.WindowEvent evt) {
System.out.println("formWindowClosing : Are you sure you want to quit?");
if (true)
this.dispose();
}
private void formWindowClosed(java.awt.event.WindowEvent evt) {
System.out.println("formWindowClosed");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JavaApplication1 m = new JavaApplication1();
m.setSize(300, 200);
m.setVisible(true);
}
});
}
}
The following will be printed
formWindowClosing : Are you sure you want to quit?
formWindowClosed
However, when I change from JFrame
to JDialog
, formWindowClosed
is called twice!
formWindowClosing : Are you sure you want to quit?
formWindowClosed
formWindowClosed
Here the code
public class JavaApplication1 extends javax.swing.JDialog {
public JavaApplication1() {
this.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
}
private void formWindowClosing(java.awt.event.WindowEvent evt) {
System.out.println("formWindowClosing : Are you sure you want to quit?");
if (true)
this.dispose();
}
private void formWindowClosed(java.awt.event.WindowEvent evt) {
System.out.println("formWindowClosed");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JavaApplication1 m = new JavaApplication1();
m.setSize(300, 200);
m.setVisible(true);
}
});
}
}
May I know why it happen such? Is this a bug? How can I prevent this? I do not want to use System.exit
, as this dialog may be child dialog, not the main application dialog.