我有一个带有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 ??
}
}
}
答案 0 :(得分:2)
第二次阅读后,我同意其他人说他们不应该创建和丢弃JFrame(或者根本不使用多个JFrame)。但如果你真的想走这条路,我建议:
JFrame.HIDE_ON_CLOSE
代替3
(关闭时退出) - 请勿使用幻数; 更新:将上述建议应用于您的架构的步骤如下:
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);
,它应该有效