关闭Java的JFrame退出

时间:2011-10-17 21:43:03

标签: java jframe

我不知道如何使用此代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

用x按钮关闭程序。

8 个答案:

答案 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)

我花了很多时间通过互联网寻找一个优雅的解决方案。通常情况下,我发现了很多相互矛盾的信息。

我终于结束了:

  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)
      {}
    }
    

答案 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);