Bagaimana cara menangkap peristiwa klik tombol tutup JFrame?


87

Saya ingin memanggil metode confirmExit()ketika tombol tutup merah dari bilah judul JFrame diklik.

Bagaimana saya bisa menangkap peristiwa itu?

Saya juga ingin mencegah jendela ditutup jika pengguna memilih untuk tidak melanjutkan.

Jawaban:


149
import javax.swing.JOptionPane;
import javax.swing.JFrame;

/*Some piece of code*/
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});

Jika Anda juga ingin mencegah jendela ditutup kecuali pengguna memilih 'Ya', Anda dapat menambahkan:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

25

Timpa Metode Penutupan jendela.

public void windowClosing(WindowEvent e)

Ini dipanggil ketika jendela sedang dalam proses ditutup. Operasi penutupan dapat diganti pada saat ini.


3
Apakah ini akan berfungsi jika pengguna menutup aplikasi (misalnya, dengan menekan Cmd + Q di Mac)? Apakah kelas yang mengimplementasikan metode ini harus mendeklarasikan implements WindowListeneragar kode ini berfungsi? Jika demikian, mungkin baik untuk memasukkannya ke dalam jawaban. Kalau tidak, ini adalah solusi yang elegan.
intcreator

@brandaemon Jika Anda menambahkan baris kode ini ke bagian atas metode utama () "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" maka itu akan memanggil windowListener ketika Cmd + Q ditekan di mac.
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

juga bekerja. Pertama buat JFrame yang disebut frame, lalu tambahkan kode ini di bawahnya.


9
Tapi ini tidak mengeksekusi confirmExit()metode seperti yang diinginkan OP
hage

Itu melakukan hal yang sama meskipun
Russell

11
Tidak, saya tidak ingin menutup program begitu saja. Saya ingin melakukan sesuatu sebelum itu terjadi.
alxcyl

oh maaf, saya tidak tahu itu.
Russell

1
"Yang ingin saya lakukan adalah menelepon ... confirmExit()ketika [X] diklik." Dan komentar sebelumnya tidak terkait dengan OQ.
DSlomer64


1

Inilah yang saya taruh sebagai pilihan menu dimana saya membuat tombol pada a JFrameuntuk menampilkan yang lain JFrame. Saya ingin hanya bingkai baru yang terlihat, dan tidak menghancurkan yang di belakangnya. Saya awalnya menyembunyikan yang pertama JFrame, sedangkan yang baru menjadi terlihat. Setelah menutup yang baru JFrame, saya membuangnya diikuti dengan tindakan membuat yang lama terlihat lagi.

Catatan: Kode berikut memperluas jawaban Ravinda dan ngmerupakan JButton:

ng.addActionListener((ActionEvent e) -> {
    setVisible(false);
    JFrame j = new JFrame("NAME");
    j.setVisible(true);
    j.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            setVisible(true);
        }
    });
});

-2

Coba ini:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Ini akan berhasil.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.