摆动 - 处理框架

时间:2015-03-24 17:40:51

标签: java swing jframe

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

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

所以当按下这个退出按钮时。我希望这个小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);
    }
}

2 个答案:

答案 0 :(得分:4)

首先,使用小写字母命名类不是一个好习惯,因此请尝试重命名为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");
           }
       }
   }
}

答案 1 :(得分:3)

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

smallFrame.dispatchEvent(new WindowEvent(smallFrame, WindowEvent.WINDOW_CLOSING));

除此之外,您的代码无法正常工作,因为您没有关闭小窗口的实例,而是在创建另一个实例并将其处理掉。在关闭事件中,您应该关闭smallFrame实例。

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

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

<强>文档

http://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html