[英]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.