Java 两扇窗户都关上了?

Java 两扇窗户都关上了?,java,swing,jframe,Java,Swing,Jframe,我有一个带有JButton的JFrame主窗口。当我点击按钮时,会打开一个新窗口,但当我想关闭第二个窗口时,两个窗口都会关闭!我要第一个一直打开。有没有办法只关闭第二个窗口?谢谢你的帮助!谢谢 编辑:我添加新代码以显示我的问题。类GUI1有一个主框架和一个按钮来打开第二个框架GUI2,该框架有一个按钮来关闭GUI2框架。这是GUI 2的结尾部分,我无法解决。代码很简单,仅用于测试 桂1 桂2 在第二次阅读之后,我同意其他人的观点,他们说你不应该创建和丢弃JFrames(或者根本不应该使用多个JF

我有一个带有JButton的JFrame主窗口。当我点击按钮时,会打开一个新窗口,但当我想关闭第二个窗口时,两个窗口都会关闭!我要第一个一直打开。有没有办法只关闭第二个窗口?谢谢你的帮助!谢谢

编辑:我添加新代码以显示我的问题。类GUI1有一个主框架和一个按钮来打开第二个框架GUI2,该框架有一个按钮来关闭GUI2框架。这是GUI 2的结尾部分,我无法解决。代码很简单,仅用于测试

桂1

桂2


在第二次阅读之后,我同意其他人的观点,他们说你不应该创建和丢弃JFrames(或者根本不应该使用多个JFrames)。但如果你真的想走这条路,我建议:

  • 创建一个JFrame,并将其引用存储在按钮可以访问的位置
  • 按下“添加”按钮时的帧
  • 使用而不是(关闭时退出)-不要使用幻数
  • 按下另一个按钮时的帧
更新:将上述建议应用于您的体系结构的步骤如下:

  • 将一个字段添加到您的
    GUI1
    class-
    private GUI2框架
    ——并且只创建一次(例如在GUI1的构造函数中)
  • 在执行的
    操作中
    ,仅使用
    frame.setVisible(true)
    ——因为已经创建了框架
  • 如果您愿意,我相信您可以在GUI 2上保留
    DISPOSE\u ON\u CLOSE
    ,但是
    HIDE\u ON\u CLOSE
    更合适
  • 由于实现动作侦听器的是
    GUI2
    ——JFrame,因此您已经有了对它的引用:
    this
    !使用
    this.setVisible(false)
    或简单地
    setVisible(false)

更改:
frame2.setDefaultCloseOperation(3)
frame2.setDefaultCloseOperation(在关闭时处理)并且它应该可以工作

我有一个带有JButton的JFrame主窗口。当我点击按钮时,会打开一个新窗口,但当我想关闭第二个窗口时,两个窗口都会关闭

1.使用
CardLayout
而不是在运行时创建一堆
JFrames
,这是一个非常糟糕的概念,这些对象从未从UsedMemory中消失,也从未被GC化过


2.使用
HIDE_ON_CLOSE
而不是
DISPOSE_ON_CLOSE

对于默认关闭操作,您可能应该使用常量而不是
3
,以使其更清晰。3是否在关闭时退出?请看它是
JFrame.DISPOSE\u on\u close
,但请看哦,不要使用“神奇数字”-我必须承认,在猜测问题之前,我不必浏览代码片段。好的,很好!但是如果我想用JButton关闭第二帧,那么就用按钮关闭它。在操作时,调用frame.dispose()
,但如果您以前没有听到,请参见但我的按钮位于第二个帧中,第二个帧的引用位于第一个帧的类中。如何从第二个窗口调用frame.dispose()。@3D krativ我无法回答,因为我不知道您的架构。其中:a)创建该按钮的代码?b) 将侦听器添加到该按钮的代码?c) 将该按钮添加到框架的代码?d) 监听器执行的代码是什么?至少(c)将同时引用按钮和框架。但最终由您决定使框架参照可供按钮访问的最佳方式。@3D KREATIVE检查更新答案,第二个窗口的参照仅为
this
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI1 extends JFrame implements ActionListener{
JButton btn1;
Container contentPane;
public GUI1()
{
    setTitle("GUI 1");
    setResizable(false);
    setSize(600,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
    btn1 = new JButton("Open GUI 2 frame");
    contentPane.add(btn1);
    btn1.setFocusable(false);
    btn1.addActionListener(this);
}
public void actionPerformed(ActionEvent event){
    if(event.getSource() == btn1)
    {
        GUI2 frame2 = new GUI2();
        frame2.setVisible(true);
    }
}
public static void main(String[] args) {
    GUI1 frame = new GUI1();
    frame.setVisible(true);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI2 extends JFrame implements ActionListener {
Container contentPane;
JButton btn2;
public GUI2()
{
    setTitle("GUI 2");
    setResizable(false);
    setSize(400,200);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
    btn2 = new JButton("Close GUI 2 frame");
    contentPane.add(btn2);
    btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent event){
    if(event.getSource() == btn2)
    {
        // Close GUI2 ??
    }
}
}