繁体   English   中英

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

[英]Press [X] button to close JFrame won't invoke dispose method

我已经设置了一个像这样的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)两种情况下都会调用的方法?

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

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

类似地,如果你想在框架关闭时做某事,确保它的方法是将WindowListener挂钩到框架,并将你的结束动作放在windowClosing()

您是否尝试使用windowClosing()方法添加WindowListener? 这应该告诉你什么时候它是一个处置或退出。

编辑:刚试了一下 - 应该做的工作,取决于你是否必须在dispose()而不是在windowClosing()中做某事。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM