Bir JFrame'in kapat düğmesi tıklama etkinliği nasıl yakalanır?


87

confirmExit()Bir JFrame'in başlık çubuğunun kırmızı kapat düğmesine tıklandığında bir yöntem çağırmak istiyorum .

Bu olayı nasıl yakalayabilirim?

Ayrıca, kullanıcı devam etmemeyi seçerse, pencerenin kapanmasını önlemek istiyorum.

Yanıtlar:


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);
        }
    }
});

Kullanıcı 'Evet'i seçmedikçe pencerenin kapanmasını da önlemek istiyorsanız, şunları ekleyebilirsiniz:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

25

WindowClosing Method'u geçersiz kıl.

public void windowClosing(WindowEvent e)

Bir pencere kapanma sürecindeyken çağrılır. Kapatma işlemi bu noktada geçersiz kılınabilir.


3
Kullanıcı uygulamayı kapatırsa bu işe yarar mı (örneğin, Mac'te Cmd + Q tuşlarına basarak)? Bu yöntemi uygulayan sınıfın implements WindowListenerbu kodun çalışması için bildirmesi gerekiyor mu? Eğer öyleyse, cevaba bunu eklemek iyi olabilir. Aksi takdirde bu zarif bir çözümdür.
— intcreator

@brandaemon Bu kod satırını main () yönteminizin üstüne eklerseniz "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" Mac'te Cmd + Q tuşlarına basıldığında windowListener'ı çağıracaktır.
— retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ayrıca çalışır. Önce çerçeve adında bir JFrame oluşturun, ardından bu kodu altına ekleyin.


9
Ancak bu, confirmExit()yöntemi OP'nin istediği gibi yürütmez
— hage

Yine de aynı şeyi yapıyor
— Russell

11
Hayır, programı basitçe kapatmak istemiyorum. Olmadan önce bir şeyler yapmak istiyorum.
— alxcyl 01

oh üzgünüm, bunu bilmiyordum.
— Russell

1
"Yapmak istediğim şey, confirmExit()[X] tıklandığında ... aramak ." Ve önceki yorum OQ ile ilgili değil.
— DSlomer64


1

Bu, bir JFramediğerini görüntülemek için a üzerinde bir düğme yaptığım bir menü seçeneği olarak koyduğum şeydir JFrame. Sadece yeni çerçevenin görünür olmasını ve arkasındaki çerçeveyi yok etmemesini istedim. Yenisi JFramegörünür hale gelirken başlangıçta ilkini sakladım . Yenisini kapattıktan sonra JFrame, onu elimden aldım ve ardından eskisini tekrar görünür kılma eylemi yaptım.

Not: Aşağıdaki kod, Ravinda'nın cevabını genişletiyor ve ngbir 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

Bunu dene:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Çalışacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.