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。 通常情况下,我发现了很多冲突的信息。
我终于结束了:
- 不要使用
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) {} }
如果你正在使用一个框架(类扩展框架),你不会得到的
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
以下代码适用于我:
System.exit(home.EXIT_ON_CLOSE);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
这在Class Extends Frame的情况下适用于我