两个窗户都在关闭?

时间:2012-05-28 12:04:08

标签: java swing jframe

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

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

GUI1

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);
}
}

GUI2

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 ??
    }
}
}

3 个答案:

答案 0 :(得分:2)

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

  • 创建一个JFrame,并在按钮可以访问的位置存储对它的引用;
  • Show按下“添加”按钮时的框架;
  • 使用JFrame.HIDE_ON_CLOSE代替3(关闭时退出) - 请勿使用幻数;
  • Hide按下另一个按钮时的框架。

更新:将上述建议应用于您的架构的步骤如下:

  • GUI1类中添加一个字段 - private GUI2 frame - 并且只创建一次(例如在GUI1的构造函数中);
  • actionPerformed中,仅使用frame.setVisible(true) - 因为框架已经创建;
  • 如果您愿意,我相信您可以将DISPOSE_ON_CLOSE保留在GUI2上,但HIDE_ON_CLOSE更合适;
  • 因为它是GUI2 - JFrame - 正在实现动作侦听器,你已经有了它的引用:this!使用this.setVisible(false)或仅setVisible(false)

答案 1 :(得分:2)

  

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

1.使用CardLayout而不是在运行时创建一堆JFrames,非常糟糕的概念,这些对象永远不会从UsedMemory,也不是GC'ed

2.使用HIDE_ON_CLOSE代替DISPOSE_ON_CLOSE

答案 2 :(得分:0)

更改:frame2.setDefaultCloseOperation(3);frame2.setDefaultCloseOperation(DISPOSE_ON_CLOSE);,它应该有效