use*_*119 8 java swing dispose visibility
我有一个独立的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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在MainFrame.java如果我改变这行setVisible(false)来dispose(),然后JFrame中消失,当我按一下按钮.我的问题是,为什么这适用dispose()而不适用setVisible(false)?我有更好的方法来组织我的代码吗?我是Swing的新手,所以如果这是一个基本问题,我道歉.谢谢.
编辑2011-10-19 10:26 PDT
感谢大家的帮助.我将JDialog更改为null父级,现在一切都按我的意愿运行.
查看启动JDialog的行:
dialog = new MyDialog(this);
Run Code Online (Sandbox Code Playgroud)
您正在设置与对话框所在的父框架相同的框架.你看,一个对话框不能单独出现,它必须位于父框架的顶部.
所以在你的代码中,当你写:
setVisible(false); // works when changed to dispose();
dialog.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
在第一行中,您告诉框架消失,然后您告诉对话框出现,这实际上告诉对话框出现在其父框架上.由于父框架是相同的,因此看起来它对您来说是可见的.如果删除第二行,我确定框架会消失.但是当你告诉框架处理它时,它会完全消失,因为你告诉它不仅会失去可见性,而且会将自己从内存中移除.
然后,当您告诉对话框出现时,它会查找其JFrame(已经处理掉),重新初始化并打开.
解决问题的方法是为JDialog创建一个单独的新JFrame.然后不要使用dispose并只使用setVisible命令.
-Asaf