在java中关闭窗口事件

时间:2009-12-31 06:19:04

标签: java user-interface swing window

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

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

    });

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

7 个答案:

答案 0 :(得分:10)

windowClosingWindowListener界面的一部分。使用addWindowListener代替addWindowStateListener

答案 1 :(得分:3)

通常你会使用WindowListener。

查看Closing an Application我使用的方法,但我必须承认我从未尝试使用Netbeans,因为我没有使用IDE。

答案 2 :(得分:3)

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

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

答案 3 :(得分:1)

刚刚调试了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。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

谢谢大家帮我解决问题。我没有完全记下它,但下面的代码解决了这个问题:

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

        });
    }

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

答案 6 :(得分:-2)

正如其他人已经指出WindowListener就是你所追求的......但是你应该在重写方法时从现在开始这样做:

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

    });

然后编译器将告诉您何时没有实际覆盖方法,而是添加新方法(在这种情况下永远不会被调用)。