我有一個獨立的Java應用程序,它從數據庫獲取數據並將其顯示在JTable中。當應用程序啓動時,會提示用戶在JDialog中輸入用戶名/密碼。輸入正確的憑證後,將顯示包含數據的主JFrame。在主JFrame中,我有一個註銷按鈕,單擊時應關閉主JFrame並重新顯示登錄JDialog。除了我發現在單擊註銷按鈕時,主JFrame不會消失,一切都基本上正常工作。下面是我的代碼小的工作示例:Java Swing dispose()與setVisible(false)
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);
}
}
In MainFrame.java如果我將setVisible(false)
這一行改爲dispose()
,那麼當我點擊按鈕時JFrame就會消失。我的問題是,爲什麼這個工作與dispose()
而不是setVisible(false)
?有沒有更好的方式來組織我的代碼?我是Swing的新手,所以如果這是一個基本問題,我很抱歉。謝謝。
EDITED 2011-10-19 10:26 PDT
謝謝大家的幫助。我改變了JDialog有一個空父母,現在一切正常,因爲我想。
爲了更好地幫助越早,張貼[SSCCE(HTTP:// pscode。組織/ sscce.html)。 –