Questionar saída, em aplicação Swing!

Estou montando um sistema desktop com Swing/AWT.
Gostaria de implementar um procedimento, que, ao clicar no botão fechar [X] do meu JFrame principal, o sistema pergunta se realmente é isto que o usuário quer fazer, se confirmar então fecha, caso contrário mantém o JFrame aberto.

Alguém tem alguma sugestão :?:

Consegui capturar o evento WindowEvent.WINDOW_CLOSING, contudo não consigo cancelá-lo!

Estou no caminho certo?

:wink:

Seu JFrame pode implementar a interface WindowListener, ai no método windowClosing você coloca a implementação do que você quer que aconteça, no seu caso, criar a janela de confirmação.
Não se esqueça de adicionar ao construtor da sua classe a seguinte chamada:

Bom dia!

O que você pode fazer é o seguinte. Modificar o setDefaultCloseOperation(int) de javax.swing.WindowConstants.EXIT_ON_CLOSE para javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE e depois implementar um WindowListener.
Dê uma olhada na documentação do swing no javadoc e se achar complexo demais, de um toque.

Até!

[Editado]
Mensagem duplicada, desculpe.
[/Editado]

Obrigado Ricardo.
Na verdade, meu objetivo é cancelar o evento de Fechar do JFrame.

Eu implementei a seguinte solução, para o problema:

No frame, cancelei a ação do botão fechar:

framePrincipal.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Capturei o evento WindowClosing, faço a pergunta, e fecho manualmente o sistema.

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,"Deseja Sair Realmente?", "Sistema informa:", JOptionPane.YES_NO_OPTION);
		if(selectedOption == JOptionPane.YES_OPTION){
			
			System.exit(0);  	                	
		}	
					}	
				}
			});

:wink:

3 curtidas

pessoal eu to com um problema parecido… eu to querendo o seguinte, um determinado botão na primeira janela abre a segunda, se eu fechar a segunda, quero que feche só a segunda…até ai ok, eu usei JDialog ao inves de JFrame na construção da 2 janela.

a questão é a seguinte, eu tenho um botão no meio da janela (nas 2) que serve pra fecha a janela, ai no actionperformed, no metodo chamado por ele, eu coloquei um system.exit… o problema é que isso fecha as 2 janelas…e eu quero q só feche uma…

o que que eu devo colocar no corpo desse metodo ai pra fecha só a janela do botão que foi clicado? (se for apertado na segunda janela, quero que feche só ela, se for na primera pode até fecha as 2…)

to botando um codigo aki pra ilustra esse exemplo:

janela1

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Janela1 extends JFrame{
   
    JButton abrir;
    JButton fechar;
    public static void main(String args[]){
        Janela1 j=new Janela1();
        j.setVisible(true);
        j.setDefaultCloseOperation(EXIT_ON_CLOSE);
    } 
    public Janela1() {
        super("Janela 1");
        setSize(500,500);
        
        criaJanela();
    }
    
    public void criaJanela(){
        
        setLayout(null);
        Container tela = getContentPane();
        
        abrir=new JButton("ABRIR");
        fechar=new JButton("FECHAR");
        
        abrir.setBounds(200,200,100,25);
        fechar.setBounds(200,250,100,25);
        
        tela.add(abrir);
        tela.add(fechar);
        
        abrir.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    //ação feita ao apertar o botão
                    abre(e);
                }
            }
        );
        
        fechar.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    //ação feita ao apertar o botão
                    fecha(e);
                }
            }
        );
        
    }
    
    //metodo chamado ao apertar o botão, ele deve abrir a janela 2
    public void abre(ActionEvent e){
            
            Janela2 obj=new Janela2();
            obj.criaJanela();
            
    }
    
    //botão de fecha a janela
    public void fecha(ActionEvent e){
        
        System.exit(0);
    }
}

janela 2

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;

public class Janela2 extends JDialog{
    
    JButton abrir;
    JButton fechar;
    public static void main(String args[]){
        Janela2 j=new Janela2();
        j.setVisible(true);
        j.setDefaultCloseOperation(EXIT_ON_CLOSE);
    } 
    public Janela2() {
        super();
        setSize(500,500);
        setVisible(true);
        criaJanela();
    }
    
    public void criaJanela(){
        
        setLayout(null);
        Container tela = getContentPane();
        
        abrir=new JButton("ABRIR");
        fechar=new JButton("FECHAR");
        
        abrir.setBounds(200,200,100,25);
        fechar.setBounds(200,250,100,25);
        
        tela.add(abrir);
        tela.add(fechar);
        
        abrir.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    //ação feita ao apertar o botão
                    abre(e);
                }
            }
        );
        
        fechar.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    //ação feita ao apertar o botão
                    fecha(e);
                }
            }
        );
        
    }
    public void abre(ActionEvent e){

          JOptionPane.showMessageDialog(null, "o botão foi apertado");
          
    }
    
    //kero que esse metodo só feche a janela que ele esta, 
    //e o system.exit ta fechando as 2
    public void fecha(ActionEvent e){
        
        System.exit(0);
    }
}

alguem ai pode me ajuda???

Não pegue carona no tópico dos outros.

System.exit(0); é para fechar a aplicação.
Se seu interesse é só fechar a janela, use o método dispose();

Se você quer só esconder a janela, para depois usa-la novamente, use setVisible(false);

Ambos os métodos existem na classe JFrame, JDialog e JInternalPane.

ainda bem que achei isso, agradeço a todos!

pessoal eu também to com um problema!!!

eu queria que quando eu clicasse no ícone fechar, apresenta-se uma janela de confirmação!

mais só na tela principal!!!

as demais telas nao!!

obrigado!

[quote=andreromano]pessoal eu também to com um problema!!!

eu queria que quando eu clicasse no ícone fechar, apresenta-se uma janela de confirmação!

mais só na tela principal!!!

as demais telas nao!!

obrigado! [/quote]

Adicione o listener descrito nesse tópico só na janela principal. Nas demais, deixe o comportamento definido para DISPOSE_ON_CLOSE.

Realmente precisava ter reaberto o tópico? Ou foi preguiça de ler os exemplos? Ali fica claro que para fazer confirmação, é necessário código de sua parte.