【问题标题】:close window event in javajava中的关闭窗口事件
【发布时间】:2010-12-31 08:23:22
【问题描述】:

我添加了一个窗口状态监听器如下:

this.addWindowStateListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            ExitAction.getInstance().actionPerformed(null);
        }

    });

但是当我使用 X 关闭按钮时,不会调用该事件。 我认为这与netbean jdesktop 框架有关。但我找不到可能是什么问题。 谢谢你的帮助。

【问题讨论】:

    标签: java user-interface swing window


    【解决方案1】:

    windowClosingWindowListener 接口的一部分。使用addWindowListener 而不是addWindowStateListener

    【讨论】:

    • +1。请注意,WindowStateListener 用于处理在窗口最小化或最大化等时触发的事件,但未关闭。
    【解决方案2】:

    通常您为此使用 WindowListener。

    查看Closing an Application 了解我使用的一种方法,尽管我必须承认我从未在 Netbeans 上尝试过,因为我不使用 IDE。

    【讨论】:

      【解决方案3】:

      不直接回答您的问题(因为已经给出了答案),但我假设您想在退出时退出您的程序(或只是隐藏一个窗口)。对于这些情况,有一个更短的解决方案:

      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      

      【讨论】:

        【解决方案4】:

        刚刚在我的 Swing 程序中调试了一个类似的问题。原来是一个 Java 错误,它会在创建 Swing UI 之前调用 ImageIO 时杀死系统 UI 事件。请参阅此处以获取最小示例 -

        https://stackoverflow.com/questions/18964138/osx-specific-new-java-ui-bug-reproducable-java-imageio-close-window-event-bug

        此错误会阻止将系统 UI 事件(例如窗口关闭)传递给 Java。

        【讨论】:

          【解决方案5】:

          正如 Java 文档所说,要真正关闭窗口,侦听器应该调用窗口的 dispose 或 setVisible(false) 方法。

          【讨论】:

            【解决方案6】:

            感谢大家帮助我解决问题。我不完全理解它,但下面的代码解决了这个问题:

                Frame[] frames = Frame.getFrames();
                for(Frame f: frames){
                    f.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            ExitAction.getInstance().actionPerformed(null);
                        }
            
                    });
                }
            

            看起来好像框架添加了额外的框架。 谢谢,

            【讨论】:

              【解决方案7】:

              正如其他人指出的那样,WindowListener 是你所追求的......但你应该从现在开始在覆盖方法时这样做:

              this.addWindowStateListener(
                  new WindowAdapter() 
                  {
                      @Overrides
                      public void windowClosing(WindowEvent e) 
                      {
                          ExitAction.getInstance().actionPerformed(null);
                      }
              
                  });
              

              然后编译器会告诉你什么时候你实际上并没有重写一个方法,而是添加一个新方法(在这种情况下永远不会被调用)。

              【讨论】:

              • WindowAdapter 既是 WindowListener 又是 WindowStateListener。这里的问题是它被添加为 WindowStateListener,所以它作为 WindowListener 的方法没有被调用。
              • 是的,我不知道它实现的不仅仅是 WindowListener。多么奇怪......显然他们在1.4中添加了这一点。在 1.4 之前,如果 Java 有注释,我所说的会起作用 :-) (不删除答案,因为它作为一般规则有效,但不适用于这种特定情况)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多