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.

alxcyl
sumber

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);
Ravindra Gullapalli
sumber
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.

Shashank Kadne
sumber
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.

Russell
sumber
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

Ini mungkin berhasil:

jdialog.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
        System.out.println("jdialog window closed event received");
    }

    public void windowClosing(WindowEvent e) {
        System.out.println("jdialog window closing event received");
    }
});

Sumber: https://alvinalexander.com/java/jdialog-close-closing-event

Phidippus
sumber
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);
        }
    });
});
Cody
sumber
-2

Coba ini:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Ini akan berhasil.

vikas bodade
sumber