Eu quero chamar um método confirmExit()
quando o botão vermelho fechar da barra de título de um JFrame é clicado.
Como posso capturar esse evento?
Também gostaria de evitar que a janela feche se o usuário optar por não continuar.
Respostas:
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);
}
}
});
Se você também deseja impedir que a janela feche, a menos que o usuário escolha 'Sim', você pode adicionar:
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
Substituir método de fechamento de janela.
public void windowClosing(WindowEvent e)
É invocado quando uma janela está em processo de fechamento. A operação de fechamento pode ser substituída neste ponto.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
também funciona. Primeiro crie um JFrame chamado frame e, em seguida, adicione esse código abaixo.
confirmExit()
método como o OP gostaria
confirmExit()
quando [o X] for clicado." E o comentário anterior não está relacionado ao OQ.
Isso pode funcionar:
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");
}
});
Fonte: https://alvinalexander.com/java/jdialog-close-closing-event
Isso é o que eu coloquei como uma opção de menu onde fiz um botão em um JFrame
para exibir outro JFrame
. Queria apenas que a nova moldura ficasse visível e não destruir a que estava por trás dela. Eu inicialmente escondi o primeiro JFrame
, enquanto o novo se tornou visível. Ao fechar o novo JFrame
, descartei-o seguido por uma ação de tornar o antigo visível novamente.
Observação: o código a seguir expande a resposta de Ravinda e ng
é um 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);
}
});
});
Experimente isto:
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
Vai funcionar.
implements WindowListener
para que esse código funcione? Nesse caso, pode ser bom incluir isso na resposta. Caso contrário, esta é uma solução elegante.