【问题标题】:JFrame Exit on close JavaJFrame 在关闭 Java 时退出
【发布时间】:2011-12-09 15:21:42
【问题描述】:

我不明白如何使用此代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

使用 x 按钮关闭程序。

【问题讨论】:

  • 不幸的是,使用 JFrame.EXIT_ON_CLOSE 的可怕之处在于,一旦所有的 jframe 都关闭,它基本上会调用 System.exit(0),这意味着它会杀死所有其他未完成的线程!哇!
  • 如果您使用的是框架(类扩展框架)this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

标签: java jframe


【解决方案1】:

如果你不扩展JFrame并在变量中使用JFrame本身,你可以使用:

frame.dispose();
System.exit(0);

【讨论】:

    【解决方案2】:

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

    我终于结束了:

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

    【讨论】:

      【解决方案3】:

      this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

      在类扩展框架的情况下这对我有用

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 是的。我一分钟前刚刚修好了
        • 感谢编辑。不幸的是,我似乎无法撤销反对票或添加赞成票,因为该网站软件声称它没有被编辑。 :(
        【解决方案5】:

        如果您使用的是框架(类扩展框架),您将无法获得

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
        

        【讨论】:

        • 如果您使用的是框架(类扩展框架)this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        【解决方案6】:

        你需要这条线

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        

        因为按下 X 按钮时 JFrame 的默认行为相当于

        frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
        

        所以几乎所有时候您都需要在创建 JFrame 时手动添加该行

        我目前指的是WindowConstants 中的常量,例如WindowConstants.EXIT_ON_CLOSE,而不是直接在JFrame 中声明的相同常量,因为前面更能反映意图。

        【讨论】:

        • +1 用于识别帧的正确默认操作/行为。 OTOH 通常最好确保没有其他非守护线程正在运行,并将帧退出操作设置为JFrame.DISPOSE_ON_CLOSE
        • 我的 ide 告诉我它应该是 WindowConstants.EXIT_ON_CLOSE
        • 没关系,你可以同时使用它们,因为它们对每个常量都有相同的整数值,但是,是的,WindowConstants 接口已经被引入来替换直接在 JFrame 中声明的常量,因为它更好地反映了意图
        • 如果你使用框架(类扩展框架)而不是使用 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        【解决方案7】:

        以下代码适用于我:

        System.exit(home.EXIT_ON_CLOSE);
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 也许 OP 想尝试使用 this code 创建 3 个设置 JFrame.DISPOSE_ON_CLOSE 的帧。行为与设置 JFrame.EXIT_ON_CLOSE 时不同。
          • 实际上,我认为 jaime 是迄今为止唯一完全正确的人。如果一个框架被释放并且没有非守护线程在运行,JRE 退出。
          • @Andrew Thompson 请查看我的 IDE_relevant 帖子
          • @Andrew Thompson 啊,你是对的我丢失了 Dispose,我删除了我的 pip - pip - pip
          • 根据 javadoc setDefaultCloseOperation “注意:当 Java 虚拟机 (VM) 中的最后一个可显示窗口被处理掉时,VM 可能会终止。有关更多信息,请参阅 AWT 线程问题。”所以,它并没有说有保证,但它可以。
          猜你喜欢
          • 1970-01-01
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          • 2012-07-13
          • 2012-11-05
          相关资源
          最近更新 更多