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.