我不知道如何使用此代码:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
用x按钮关闭程序。
答案 0 :(得分:75)
你需要一行
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
因为按下X按钮时JFrame的默认行为等同于
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
所以几乎所有时候你都需要在创建JFrame时手动添加该行
我目前指的是WindowConstants
中的常量,例如WindowConstants.EXIT_ON_CLOSE
,而不是直接在JFrame
中声明的相同常量,因为先前的反映意图更好。
答案 1 :(得分:6)
如果您没有,JFrame将被处理掉。框架将关闭,但应用程序将继续运行。
答案 2 :(得分:4)
调用setDefaultCloseOperation(EXIT_ON_CLOSE)
就是这样做的。当应用程序从操作系统收到关闭窗口事件时,它会导致应用程序退出。按下窗口上的关闭(X)按钮会导致操作系统生成关闭窗口事件并将其发送到Java应用程序。关闭窗口事件由Java应用程序中的AWT事件循环处理,该循环将退出应用程序以响应事件。
如果不调用此方法,则AWT事件循环可能不会退出应用程序以响应关闭窗口事件,但会使其在后台运行。
答案 3 :(得分:3)
我花了很多时间通过互联网寻找一个优雅的解决方案。通常情况下,我发现了很多相互矛盾的信息。
我终于结束了:
EXIT_ON_CLOSE
,因为这会留下资源; 在JFrame初始化中使用以下内容:
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
真正的发现是如何将窗口消息实际分派给JFrame。作为示例,作为退出应用程序的JMenuItem的一部分,使用以下函数,其中函数getFrame()
返回对JFrame的引用:
public class AppMenuFileExit extends JMenuItem implements ActionListener
{
// do your normal menu item code here
@Override
public void actionPerformed(ActionEvent e)
{
WindowEvent we;
we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
App.getFrame().dispatchEvent(we);
}
}
JFrame是Window的子类,因此可以为此目的转换为Window。
并且,在JFrame类中使用以下内容来处理Window消息:
public class AppFrame extends JFrame implements WindowListener
{
// Do all the things you need to for the class
@Override
public void windowOpened(WindowEvent e)
{}
@Override
public void windowClosing(WindowEvent e)
{/* can do cleanup here if necessary */}
@Override
public void windowClosed(WindowEvent e)
{
dispose();
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e)
{}
@Override
public void windowDeactivated(WindowEvent e)
{}
@Override
public void windowDeiconified(WindowEvent e)
{}
@Override
public void windowIconified(WindowEvent e)
{}
}
答案 4 :(得分:1)
如果您正在使用框架(类扩展框架),那么您将无法获得
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
答案 5 :(得分:0)
以下代码适用于我:
System.exit(home.EXIT_ON_CLOSE);
答案 6 :(得分:0)
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
这适用于Class Extends Frame
答案 7 :(得分:0)
如果您不扩展JFrame
并在变量中使用JFrame
本身,则可以使用:
frame.dispose();
System.exit(0);