Java Swing dispose () vs. setVisible (false)

у меня есть автономное приложение Java, которое получает данные из базы данных и отображает их в JTable. Когда приложение запускается, пользователю предлагается ввести имя пользователя / пароль в JDialog. После ввода правильных учетных данных отображается основной JFrame, содержащий данные. На основном JFrame у меня есть кнопка выхода, при нажатии на которую должен закрыться основной JFrame и повторно отобразить логин JDialog. Все в основном работает, за исключением того, что я обнаружил, что основной JFrame не уходит при нажатии кнопки выхода. Ниже приведен небольшой рабочий пример моего кода:

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);
    }
}

В MainFrame.java , если я изменю строку, говорит setVisible (false) до dispose () , затем JFrame уходит, когда я нажимаю кнопку. У меня вопрос: почему это работает с dispose () , а не с setVisible (false) ? Есть ли способ лучше организовать свой код? Я новичок в Swing, поэтому прошу прощения, если это основной вопрос. Спасибо.


ИЗМЕНИТЬ 2011-10-19 10:26 PDT

Всем спасибо за помощь. Я изменил JDialog на нулевого родителя, и теперь все работает так, как я хотел.

8
задан WhiteKnight 8 May 2012 в 17:31
поделиться