Przeglądając wyniki wujka Google związane z Javą, natknąłem się kilka razy na mniej lub bardziej udane przykłady kodu wyświetlającego okno, które w momencie zamykania wyświetla dialog z zapytaniem, czy użytkownik jest pewien, że chce je zamknąć. Postanowiłem samemu przygotować podobny przykład, który przy okazji uzasadni moje podejście do mechanizmu zamykania okien przedstawione we wpisie Zamykanie okien poprzez wciśnięcie przycisku Escape.

Oto on:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import javax.swing.JOptionPane;

public class AskWhenClosingFrame extends javax.swing.JFrame {

    /**
    * Konstruktor okna
    */
    public AskWhenClosingFrame() {
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Pytające okno");

        addWindowListener(new java.awt.event.WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        net.javaio.swing.SwingUtilities.installWindowClosingActionOnEscapeKey(this);
    }

    /**
    * Metoda wywoływana w przypadku próby zamknięcia okna
    *
    * @param evt
    */
    private void formWindowClosing(java.awt.event.WindowEvent evt) {
        int ans = JOptionPane.showConfirmDialog(this, "Czy na pewno zamknąć to okno?", "Pytanie?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

        if (ans == JOptionPane.YES_OPTION) {
            // Zamknięcie okna
            dispose();
        }
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                AskWhenClosingFrame frame = new AskWhenClosingFrame();
                frame.setSize(320, 240);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

Dzięki wykorzystaniu metody installWindowClosingActionOnEscapeKey okno na wciśnięcie przycisku Escape zareaguje dokładnie tak samo, jak na użycie przycisku [X].