【问题标题】:How to capture a JFrame's close button click event?如何捕获 JFrame 的关闭按钮单击事件?
【发布时间】:2012-02-23 23:49:53
【问题描述】:

我想在单击 JFrame 标题栏的红色关闭按钮时调用方法confirmExit()

如何捕捉该事件?

如果用户选择不继续,我还想阻止窗口关闭。

【问题讨论】:

    标签: java swing jframe windowlistener


    【解决方案1】:
    import javax.swing.JOptionPane;
    import javax.swing.JFrame;
    
    /*Some piece of code*/
    frame.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            if (JOptionPane.showConfirmDialog(frame, 
                "Are you sure you want to close this window?", "Close Window?", 
                JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
                System.exit(0);
            }
        }
    });
    

    如果您还想防止窗口关闭,除非用户选择“是”,您可以添加:

    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    

    【讨论】:

      【解决方案2】:

      这是我作为菜单选项放置的,我在JFrame 上创建了一个按钮以显示另一个JFrame。我只想让新框架可见,而不是破坏它后面的框架。我最初隐藏了第一个 JFrame,而新的则变得可见。关闭新的JFrame 后,我将其处理掉,然后采取措施让旧的再次可见。

      注意:以下代码扩展了 Ravinda 的答案,ngJButton

      ng.addActionListener((ActionEvent e) -> {
          setVisible(false);
          JFrame j = new JFrame("NAME");
          j.setVisible(true);
          j.addWindowListener(new java.awt.event.WindowAdapter() {
              @Override
              public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                  setVisible(true);
              }
          });
      });
      

      【讨论】:

        【解决方案3】:

        这可能有效:

        jdialog.addWindowListener(new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                System.out.println("jdialog window closed event received");
            }
        
            public void windowClosing(WindowEvent e) {
                System.out.println("jdialog window closing event received");
            }
        });
        

        来源:https://alvinalexander.com/java/jdialog-close-closing-event

        【讨论】:

          【解决方案4】:

          试试这个:

          setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
          

          它会起作用的。

          【讨论】:

            【解决方案5】:
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            

            也可以。首先创建一个名为frame的JFrame,然后在下面添加这段代码。

            【讨论】:

            • 但这不会像 OP 所希望的那样执行 confirmExit() 方法
            • 它做同样的事情
            • 不,我不想简单地关闭程序。我想在事情发生之前做点什么。
            • “我要做的是在单击 [X] 时调用 ...confirmExit()。”而且之前的评论和OQ无关。
            • 这个正好相反,加frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);就可以控制confirmExit了。
            【解决方案6】:

            覆盖 windowClosing 方法。

            public void windowClosing(WindowEvent e)
            

            当窗口正在关闭时调用。此时可以覆盖关闭操作。

            【讨论】:

            • 如果用户关闭应用程序(例如,在 Mac 上按 Cmd + Q),这会起作用吗?实现此方法的类是否必须声明 implements WindowListener 才能使此代码正常工作?如果是这样,最好将其包含在答案中。否则,这是一个优雅的解决方案。
            • @brandaemon 如果将此行代码添加到 main() 方法的顶部“System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");"然后在mac上按下Cmd + Q时它会调用windowListener。
            猜你喜欢
            • 2013-01-30
            • 2011-02-05
            • 2011-01-22
            • 2022-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多