3

我已经设置了一个这样的 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

4 回答 4

5

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

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

同样,如果你想在框架关闭时做一些事情,确保它的方法是将 a 钩WindowListener到框架上,并将你的关闭动作放入windowClosing().

于 2009-12-13T11:13:23.180 回答
1

您是否尝试过添加一个 WindowListener 并实现了 windowClosing() 方法?这应该会告诉您何时是处置或退出。

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

于 2009-12-13T09:58:30.020 回答
0

如果你把 JFrame.EXIT_ON_CLOSE 换成 EXIT_ON_CLOSE,它会起作用吗?

于 2013-04-09T11:58:01.813 回答
0

的文档dispose没有提到它在系统关闭时被调用。我认为它仍然不能保证(由javadoc)它被调用DISPOSE_ON_EXIT......
无论如何System.exit,被使用EXIT_ON_CLOSE,有点残酷,它关闭了虚拟机,之后几乎没有机会运行任何方法(尽管有一些最终确定)钩子和方法)。

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

于 2009-12-13T16:26:02.113 回答