web-dev-qa-db-fra.com

Comment capturer un événement de clic sur un bouton de fermeture de JFrame?

Je souhaite appeler une méthode confirmExit() lorsque l'utilisateur clique sur le bouton de fermeture rouge de la barre de titre d'un JFrame.

Comment puis-je capturer cet événement?

J'aimerais également empêcher la fenêtre de se fermer si l'utilisateur choisit de ne pas continuer.

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

Si vous souhaitez également empêcher la fermeture de la fenêtre à moins que l'utilisateur ne clique sur "Oui", vous pouvez ajouter:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
130
Ravindra Gullapalli

Ignorer la méthode windowClosing.

public void windowClosing(WindowEvent e)

Il est appelé lorsqu'une fenêtre est en cours de fermeture. L'opération de fermeture peut être annulée à ce stade.

25
Shashank Kadne
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

fonctionne aussi. Commencez par créer une image JFrame appelée frame, puis ajoutez ce code en dessous.

4
Russell

C’est ce que j’ai mis comme option de menu où j’ai créé un bouton sur un JFrame pour en afficher un autre JFrame. Je voulais que seul le nouveau cadre soit visible et non celui qui se trouvait derrière. J'ai initialement caché le premier JFrame, tandis que le nouveau devenait visible. À la fermeture du nouveau JFrame, j’en ai disposé, suivi d’une action visant à rendre l’ancien visible à nouveau.

Remarque: le code suivant se développe à partir de la réponse de Ravinda et ng est un 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);
        }
    });
});
1
Cody

Cela peut fonctionner:

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

Source: https://alvinalexander.com/Java/jdialog-close-closing-event

1
Phidippus