按[X]按钮关闭JFrame将不会调用dispose方法

时间:2009-12-13 09:54:50

标签: java swing jframe

我已经设置了这样的JFrame:

public class XFrame extends JFrame {

public XFrame() {
    setSize(100, 100);
}
@Override
public void dispose() {
    super.dispose();
    System.out.println("Dispose get called");
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        public void run() {
            XFrame f = new XFrame();
            f.setTitle("Hello World");
            //f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });
}
}

我期望的是,当我按下关闭按钮[X]时,将调用dispose方法。但是,只有当DISPOSE_ON_CLOSE设置为DefaultCloseOperation(???)时才会出现这种情况。 Java真的让我感到惊讶。如何实现一个在DefaultCloseOperation值(DISPOSE_ON_CLOSE& EXIT_ON_CLOSE)的情况下调用的方法?

4 个答案:

答案 0 :(得分:5)

如果你执行EXIT_ON_CLOSE,则几乎不需要处理,因为当JVM退出时,所有资源都会被“处理掉”。我将“处理”放在引号中,因为在这种自动情况下,dispose方法显然没有被调用。

请注意,Swing中的公共方法是用于来调用的,并非所有方法都必须由Swing的内部调用。例如,有setSize()setLocation()以及setBounds()方法 - 前者2会调用后者,还是相反?它没有定义,所以你不应该假设。

同样,如果你想在框架关闭时做某事,确保它的方法是将WindowListener挂钩到框架,并将结束操作放在windowClosing()中。

答案 1 :(得分:1)

您是否尝试过在实现windowClosing()方法的情况下添加WindowListener?这应该告诉你什么时候它是一个处置或退出。

编辑:刚刚尝试过 - 应该完成这项工作,具体取决于你是否必须在dispose()而不是windowClosing()中执行某些操作。

答案 2 :(得分:0)

dispose的文档未提及在系统关闭时调用它。我认为(javadoc)仍然无法保证它被DISPOSE_ON_EXIT ...发送 无论如何System.exitEXIT_ON_CLOSE使用,是一种野蛮,它会关闭虚拟机,之后几乎没有机会运行任何方法(尽管有一些敲定和方法)。

我个人不喜欢使用EXIT_ON_CLOSE,因为它的功能可以通过使用SecurityManager来禁止

答案 3 :(得分:0)

如果你把它放在EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE上,它会起作用吗?