我已经设置了这样的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)的情况下调用的方法?
答案 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.exit
由EXIT_ON_CLOSE
使用,是一种野蛮,它会关闭虚拟机,之后几乎没有机会运行任何方法(尽管有一些敲定和方法)。
我个人不喜欢使用EXIT_ON_CLOSE
,因为它的功能可以通过使用SecurityManager来禁止
答案 3 :(得分:0)
如果你把它放在EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE上,它会起作用吗?