gpt4 book ai didi

Java Swing dispose() 与 setVisible(false)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:12 24 4
gpt4 key购买 nike

我有一个独立的 Java 应用程序,它从数据库中获取数据并将其显示在 JTable 中。当应用程序启动时,系统会在 JDialog 中提示用户输入用户名/密码。输入正确的凭据后,将显示包含数据的主 JFrame。在主 JFrame 上,我有一个注销按钮,单击该按钮时,应关闭主 JFrame 并重新显示登录 JDialog。除了我发现单击注销按钮时主 JFrame 不会消失外,一切都正常。下面是我的代码的一个小示例:

主.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 更改为具有 null parent,现在一切正常。

最佳答案

查看启动 JDialog 的行:

dialog = new MyDialog(this);

您设置的框架与对话框所在的父框架相同。你看,对话框不能单独出现,它必须位于父框架之上。

所以在你的代码中,当你写:

setVisible(false); // works when changed to dispose();
dialog.setVisible(true);

在第一行中,您告诉框架消失,然后您告诉对话框出现,这实际上是告诉对话框出现在其父框架上。由于父框架是相同的,因此它看起来对您保持可见。如果你删除第二行,我相信框架会消失。但是,当您告诉框架进行处置时,它会完全消失,因为您不仅告诉它失去可见性,而且还将其自身从内存中删除。

然后,当您告诉对话框出现时,它会查找其 JFrame(已被处置),重新初始化并打开。

解决问题的方法是为 JDialog 创建一个单独的新 JFrame。然后不要使用 dispose,只使用 setVisible 命令。

-阿萨夫

关于Java Swing dispose() 与 setVisible(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com