JFrame退出closuresJava

我不知道如何使用这个代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

用xbuttonclosures程序。

你需要线路

 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

因为按下Xbutton时JFrame的默认行为等同于

 frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); 

所以几乎所有的时候,在创buildJFrame时都需要手动添加这一行

我目前指WindowConstants常量,如WindowConstants.EXIT_ON_CLOSE而不是直接在JFrame声明的常量,因为事先反映的是更好的意图。

如果你没有,JFrame将被丢弃。 该框架将closures,但应用程序将继续运行。

调用setDefaultCloseOperation(EXIT_ON_CLOSE)这样做的。 它会导致应用程序在应用程序从操作系统收到closures窗口事件时退出。 按下窗口上的closures(X)button会导致操作系统生成closures窗口事件并将其发送到Java应用程序。 closures窗口事件由Java应用程序中的AWT事件循环处理,该事件循环将退出应用程序以响应事件。

如果您不调用此方法,则AWT事件循环可能不会退出应用程序以响应closures窗口事件,而是使其在后台运行。

我花了相当多的时间通过互联网寻求一个优雅的解决scheme。 通常情况下,我发现了很多冲突的信息。

我终于结束了:

  1. 不要使用EXIT_ON_CLOSE因为这可能会遗留资源;
  2. 在JFrame初始化中使用类似下面的内容:

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
  3. 真正的发现是如何实际派发窗口消息到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。

  4. 而且,在你的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) {} } 

如果你正在使用一个框架(类扩展框架),你不会得到的

 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) 

以下代码适用于我:

 System.exit(home.EXIT_ON_CLOSE); 

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

这在Class Extends Frame的情况下适用于我