我的目标是让一个动作监听器在用户点击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);
}
}
答案 0 :(得分:4)
首先,使用小写字母命名类不是一个好习惯,因此请尝试重命名为MakeGUI
而不是makeGUI
。
评论代码的问题在于,每按一次1>时,它会创建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