Java Swing dispose() vs setVisible(false)

J'ai une application Java autonome qui récupère les données d'une base de données et l'affiche dans une JTable. Au démarrage de l'application, l'utilisateur est invité à entrer un nom d'utilisateur/mot de passe dans un JDialog. Une fois les informations d'identification correctes sont entrés, le principal JFrame contenant les données à afficher. Sur les principaux JFrame j'ai un bouton de déconnexion que lorsque l'on clique dessus, doit fermer le JFrame et de réafficher la connexion JDialog. Tout ce qui est la plupart du temps de travail sauf que j'ai trouvé que le principal JFrame ne disparaissent pas lorsque le bouton de déconnexion est cliqué. Ci-dessous un petit exemple de mon code:

Main.java:

import javax.swing.SwingUtilities;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame();
            }
        });
    }
}

MainFrame.java:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MainFrame extends JFrame implements ActionListener {
    private JButton button;
    private MyDialog dialog;

    public MainFrame() {
        super("this is the JFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dialog = new MyDialog(this);
        button = new JButton("click me to hide this JFrame and display JDialog");
        button.addActionListener(this);
        add(button);
        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        setVisible(false); //works when changed to dispose();
        dialog.setVisible(true);
    }
}

MyDialog.java:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;


public class MyDialog extends JDialog implements ActionListener {
    private JFrame parentFrame;
    private JButton button;

    public MyDialog(JFrame parentFrame) {
        super(parentFrame, "this is the JDialog", true);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.parentFrame = parentFrame;
        button = new JButton("click me to hide JDialog and show JFrame");
        button.addActionListener(this);
        add(button);
        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        setVisible(false);
        parentFrame.setVisible(true);
    }
}

Dans MainFrame.java si je change la ligne qui dit setVisible(false) à dispose() puis la JFrame s'en va quand je clique sur le bouton. Ma question est, pourquoi est-ce de travailler avec dispose() et pas avec setVisible(false)? Est-il un meilleur moyen pour moi d'organiser mon code? Je suis nouveau sur le Swing, donc je m'excuse si c'est une question de base. Merci.


ÉDITÉ 2011-10-19 10:26 PDT

Merci à vous tous pour votre aide. J'ai changé le JDialog avoir une valeur null parent et maintenant tout fonctionne comme je le voulais.

Pour mieux aider plus tôt, après une SSCCE.

OriginalL'auteur user1002119 | 2011-10-18