Pessoal, estava usando o WindowEvent e o WindowListener para criar uma ação onde quando a pessoa fosse fechar o JFrame lhe fosse questionado se a pessoa queria mesmo fechar.
Assim:
JFrame.addWindowListener(new java.awt.event.WindowAdapter(){
public void windowClosing(java.awt.event.WindowEvent e){
if(e.getID() == WindowEvent.WINDOW_CLOSING){
int selectedOption = JOptionPane.showConfirmDialog(null, "Tem certeza que quer fechar?",
"Fechar",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(selectedOption == JOptionPane.OK_OPTION){
System.exit(0);
}
}
}
});
Porem apareceu um erro dizendo:
“non-static method addWindowListener(WindowListener) cannot be referenced from a static context”
Você está tentando chamar o método addWindowListener de forma estática, isto é NomeDaClasse.nomeDoMetodo , entretanto esse método não é estático, então você precisa chamar ele a partir de um objeto e não a partir da classe.
Só dá pra escapar do erro, entendendo ele de fato.
Ao invés de chamar o método addWindowListener a partir da classe, chame a partir do objeto daquela classe.
Suponho que você implementou algo assim:
JFrame meuObjeto = new JFrame("Minha janela");
JFrame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
sair();
}
});
O correto é assim:
JFrame meuObjeto = new JFrame("Minha janela");
meuObjeto.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
sair();
}
});
Outra coisa, você implementou seu WindowListener assim:
public void windowClosing(WindowEvent e){
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
int option = JOptionPane.showConfirmDialog(null,
"Tem certeza que quer fechar?",
"Fechar",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (option == JOptionPane.OK_OPTION){
System.exit(0);
}
}
}
Não é necessário testar se o ID do evento é igual à WindowEvent.WINDOW_CLOSING pois você já está tratando o evento windowClosing da interface WindowListener.
O AWT/Swing só vão invocar este método quando ocorrer um WindowEventdo tipo WINDOW_CLOSING.
Faça simplesmente assim:
public void windowClosing(WindowEvent e){
sair(); // não coloque lógica num tratador de eventos, simplesmente invoque algum método de nome legível que contenha sua lógica
}
Método com a lógica do SAIR:
private void sair() {
int option = JOptionPane.showConfirmDialog(objetoDoSeuFrame, // evite null, passe o objeto da sua tela
"Tem certeza que quer fechar?",
"Fechar",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (option == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
A sua classe já é o JFrame ao qual você quer adicionar o WindowListener: class appteste extends JFrame
Então é só chamar diretamente o addWindowListener ou então, se achar mais legível, chama this.addWindowListener