Java 两扇窗户都关上了?
我有一个带有JButton的JFrame主窗口。当我点击按钮时,会打开一个新窗口,但当我想关闭第二个窗口时,两个窗口都会关闭!我要第一个一直打开。有没有办法只关闭第二个窗口?谢谢你的帮助!谢谢 编辑:我添加新代码以显示我的问题。类GUI1有一个主框架和一个按钮来打开第二个框架GUI2,该框架有一个按钮来关闭GUI2框架。这是GUI 2的结尾部分,我无法解决。代码很简单,仅用于测试 桂1 桂2Java 两扇窗户都关上了?,java,swing,jframe,Java,Swing,Jframe,我有一个带有JButton的JFrame主窗口。当我点击按钮时,会打开一个新窗口,但当我想关闭第二个窗口时,两个窗口都会关闭!我要第一个一直打开。有没有办法只关闭第二个窗口?谢谢你的帮助!谢谢 编辑:我添加新代码以显示我的问题。类GUI1有一个主框架和一个按钮来打开第二个框架GUI2,该框架有一个按钮来关闭GUI2框架。这是GUI 2的结尾部分,我无法解决。代码很简单,仅用于测试 桂1 桂2 在第二次阅读之后,我同意其他人的观点,他们说你不应该创建和丢弃JFrames(或者根本不应该使用多个JF
在第二次阅读之后,我同意其他人的观点,他们说你不应该创建和丢弃JFrames(或者根本不应该使用多个JFrames)。但如果你真的想走这条路,我建议:
- 创建一个JFrame,并将其引用存储在按钮可以访问的位置李>
- 按下“添加”按钮时的帧李>
- 使用而不是(关闭时退出)-不要使用幻数李>
- 按下另一个按钮时的帧
- 将一个字段添加到您的
class-GUI1
——并且只创建一次(例如在GUI1的构造函数中)李>private GUI2框架
- 在执行的
,仅使用操作中
——因为已经创建了框架李>frame.setVisible(true)
- 如果您愿意,我相信您可以在GUI 2上保留
,但是DISPOSE\u ON\u CLOSE
更合适李>HIDE\u ON\u CLOSE
- 由于实现动作侦听器的是
——JFrame,因此您已经有了对它的引用:GUI2
!使用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 ??
}
}
}