Gerenciando Fechamento de telas

Ola galera…queria uma ajuda sobre gereciar melhor janelas no swing…
seguinte estou rodando um aplicativo em swing…ai tenho uma janela principal onde apartir desta vou chamando outras janelas…mais toda a janela nova que chamo a antiga continua aberta na tela…isso dependendo do uso esta deixando muitas janelas apertas…gostaria de saber como faço pra qndo clicar para abrir uma nova janela a janela antiga fecha-se…e mais uma coisa na janela principal gostaria de qndo clicar no “X” para fechar…ele me desse a msagem por exemplo de “DESEJA REALMENTE SAIR”…

VLW

Nota: extendendo minha janela principal do JFrame.

Isto é o básico.

package guj;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ExemploFechar extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploFechar thisClass = new ExemploFechar();
                thisClass.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //  importante
                thisClass.setVisible(true);
            }
        });
    }

    public ExemploFechar() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo");
        this.addWindowListener(new WindowAdapter() { // importante
            @Override
            public void windowClosing(WindowEvent e) {
                int ret = JOptionPane.showConfirmDialog(ExemploFechar.this, "Deseja sair do programa?");
                if (ret == JOptionPane.YES_OPTION) {
                    System.exit(0); // cai fora
                }
            }
        });
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
        }
        return jContentPane;
    }

}

vlw por essa dica assim…
agora se por exemplo na janela principal qndo clicar em um botao por exemplo ele abre outra janela(ate aki ja esta OK)…ai quero q a principal feche…??
coloco System.exit() ou não??

System.exit encerra toda a aplicação. Para fechar apenas o frame faça:

brigado…
e por exemplo…coloco frame.dispose(); na principal ai ela fecha qndo chamo a outra janela…mais qndo fechar a outra janela essa janela volta…??
ou tenho q fazer algum comando na outra janela pra poder voltar a janela principal???
VLW

Se a janela precisa voltar, você deve apenas ocultar a janela.

frame.setVisible(false); //oculta a janela frame.setVisible(true); //exibe a janela
Você precisa abrir uma janela para obter alguma entrada do usuário e depois voltar para principal? Um JDialog não seria melhor do que dois JFrames?

Eu costumo ter apenas e tão somente 1 JFrame nas minhas aplicações. As outras telas costumam resolver-se com JDialogs ou então com JTabbedPanes.

O próprio JOptionPane é uma classe que cria JDialogs customizados (veja o método “createDialog”).