Java 摆动-放置框架

Java 摆动-放置框架,java,swing,jframe,Java,Swing,Jframe,我的目标是让动作监听器在用户点击JButton退出时关闭特定的JFrame 总的来说,当程序启动时,会打开一个大JFrame,然后在前面打开一个小JFrame……在我的代码中,用户在这个小JFrame中输入一些细节,然后点击submit(为了简单起见,我在这里省略了这个代码,并用quit替换了submit) 所以当按下退出按钮时。我希望这个小JFrame能够关闭。我似乎无法理解这一点。动作类的听众在不同的课堂上,我试着做例子,但没有成功。当我试图解决这个问题时,我已经注释掉了我在下面尝试过的代码

我的目标是让动作监听器在用户点击JButton退出时关闭特定的JFrame

总的来说,当程序启动时,会打开一个大JFrame,然后在前面打开一个小JFrame……在我的代码中,用户在这个小JFrame中输入一些细节,然后点击submit(为了简单起见,我在这里省略了这个代码,并用quit替换了submit)

所以当按下退出按钮时。我希望这个小JFrame能够关闭。我似乎无法理解这一点。动作类的听众在不同的课堂上,我试着做例子,但没有成功。当我试图解决这个问题时,我已经注释掉了我在下面尝试过的代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class test
{
    public static void main(String Args[])
    {
    makeGUI m = new makeGUI();
    }
}

class makeGUI
{
    JButton close = new JButton("CLOSE ME");

    makeGUI()
    {
    frame f1 = new frame();

    JFrame smallframe = new JFrame(); //want to close this one
    JPanel jp = new JPanel(new FlowLayout());
    smallframe.setSize(300,300);
    smallframe.setLocationRelativeTo(null);
    smallframe.setDefaultCloseOperation(smallframe.DISPOSE_ON_CLOSE);
    close.addActionListener(new action());
    jp.add(close);
    smallframe.add(jp);
    smallframe.setVisible(true);
    }

    class action implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    {
        //makeGUI s1 = new makeGUI();
        if (e.getSource () == close)
        {
            //s1.smallframe.dispose();
            System.out.println("gotcha");
        }
    }
    }    
}

class frame extends JFrame
{
    frame ()
    {
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("big one");
    setVisible(true);
    }
}

如果要模拟某人按下[X]按钮,则可以使用以下代码以编程方式触发此事件:

smallFrame.dispatchEvent(new WindowEvent(smallFrame, WindowEvent.WINDOW_CLOSING));
除此之外,您的代码不起作用,因为您没有关闭小窗口的实例,而是创建另一个实例并处理它。在关闭事件中,应该关闭smallFrame实例

您可以通过将JFrame传递给ActionListener的构造函数或将smallFrame作为类变量来实现这一点

看起来您正在使用小JFrame作为弹出窗口来获取信息或显示信息。如果是这样的话,您可能需要查看为“对话框”创建的JOptionPane类

文档:


首先,用小写字母命名类不是一种好的做法,因此请尝试重命名为类似于
MakeGUI
的名称,而不是
MakeGUI

注释代码的问题在于,每次单击按钮并调用操作侦听器时,它都会创建一个新的
makeGUI
实例。结果是,当您单击“关闭”按钮时,将创建一个新帧,然后创建一个内部帧,该内部帧将立即关闭。你唯一要做的就是创建越来越多的帧。您应该将实例保持为状态,例如作为类成员:

class MakeGUI {
   JFrame smallframe;
   JButton close = new JButton("CLOSE ME");


   MakeGUI() {
       frame f1 = new frame();
       smallframe = new JFrame(); //want to close this one
       JPanel jp = new JPanel(new FlowLayout());
       smallframe.setSize(300, 300);
       smallframe.setLocationRelativeTo(null);
       smallframe.setDefaultCloseOperation(smallframe.DISPOSE_ON_CLOSE);
       close.addActionListener(new action());
       jp.add(close);
       smallframe.add(jp);
       smallframe.setVisible(true);
   }

   class action implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           if (e.getSource() == close) {
               // use this instead of dispose
               smallframe.dispatchEvent(new WindowEvent(smallframe, WindowEvent.WINDOW_CLOSING));
               System.out.println("gotcha");
           }
       }
   }
}

是的,我查看了选项窗格,但更喜欢使用JFrame。啊,我明白了,虽然这不是最佳实践,但如果这是您想要的,那么在这种情况下,使用上面的代码关闭窗口将是您的最佳选择。请确保您正在关闭触发它的窗口的实例,而不是创建一个新实例,并像您的注释代码那样关闭它。是的,谢谢!我确实看过你的想法,但它结束了太多需要做的事情。不管怎样,谢谢你……我还是把你的问题评了一个等级,以备将来有人参考,是不是关得太多了?是否要保留框架,但只是使其不可见,这样就不必重新实例化它?在这种情况下,您只需
setVisible(false)