у меня есть автономное приложение 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 на нулевого родителя, и теперь все работает так, как я хотел.