JFrame和setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE)是什么意思?

3
在javadoc中,HIDE_ON_CLOSE默认选项表示
自动在调用任何已注册的WindowListener对象之后隐藏窗口。
现在问题来了,“隐藏”是什么意思?相关的对象被销毁还是只是隐藏并继续使用资源?

隐藏(Hide)基本上意味着它不会销毁与其附加的本地资源/对等体,通常使得重新显示更快,因为它不需要创建本地对等体。另一方面,Dispose将会(销毁本地对等体)。因此,如果您不经常需要重新显示框架,请使用DISPOSE_ON_CLOSE,否则请使用隐藏(Hide)。 - MadProgrammer
3个回答

6
在javadoc中,HIDE_ON_CLOSE默认选项表示:
调用任何已注册的WindowListener对象后自动隐藏框架。
那么,“隐藏”是什么意思?相关对象被销毁还是只是隐藏并继续使用资源?
HIDE_ON_CLOSE与JFrame.setVisible(false)相同,然后JFrame仅被隐藏,不可见,并且没有以某种方式被销毁(与JFrame.dispose()相同),通过JFrame.setVisible(true)再次在屏幕上可见,而且没有任何更改。
编辑:
如果我想销毁jframe(而不关闭整个应用程序)怎么办?
  1. 默认情况下没有任何理由,因为默认情况下没有创建另一个JFrame的理由,不要这样做,使用CardLayout(如果需要在屏幕上更改JFrames大小,则使用JFrame.pack()

  2. 所有这些Object都会保留并增加JVM内存,永远不会被回收, 因此在JVM内存方面,JFrame.HIDE_ON_CLOSEJFrame.DISPOSE_ON_CLOSEJFrame.setVisible(false)之间没有显着的区别

  3. (如果您讨厌CardLayout),可以从JFrames ContentPane中删除所有JComponents,然后添加新的JComponents,设置LayoutManager,并在所有更改已经可见的JFrame完成后,最后一行代码将是JFrame.(re)validate();JFrame.repaint();JFrame.pack();


你能告诉我这个的优点吗?我的意思是,如果我关闭窗口并隐藏了我的框架,我该如何使它再次可见? - Makky
@giozh 使用 DISPOSE_ON_CLOSE。 - Makky
谢谢回复,但是CardLayout不是我要找的。我需要一个独立的组件(一种弹出式窗口),以便输入一些内容进行计算。 - giozh
然后看我的观点(编辑)第三个,我仍然不理解,将JFrame创建为局部变量,然后可以从JVM的所有角落访问它,只需通过添加/删除JComponents或CardLayout切换视图,CardLayout比在屏幕上无休止地弹出新的JFrames对象和闪烁带边框的新JFrame更容易,而CardLayout则永远不会。 - mKorbel
我需要一个独立的组件(一种弹出式窗口),以便输入一些内容进行计算。不确定您是否指的是弹出窗口,例如通知或消息框,要使用JDialog,可能是未装饰的,一个JDialog,重复使用此JDialog setVisible(false / true),仅将值设置为JComponents,如果有几个视图,则CarLayout是最好的方法。 - mKorbel
显示剩余2条评论

0

将其隐藏在后台而不破坏它,保持其在内存中。


不是答案,只是评论。将此作为评论发布。 - Makky
@Makky:他怎么能把这个作为评论发布呢,他没有50分以上的积分!所以请撤销你的踩。 - Azad
然后他应该发布一个适当的答案。除非这个人编辑回来并提供更多信息,否则这不是一个答案,应该被投票降低评分。 - Makky
@Makky:是的,信息确实不足,但是并不需要因为这个而投反对票,因为它并没有错! - Azad
通常情况下,不完整的回答会被踩,因此用户需要编辑并给出一个适当的答案。 - Makky

0

HIDE_ON_CLOSE 的意思是窗口会消失,但程序仍在后台运行并占用资源,尽管不可见于屏幕上。

而使用 EXIT_ON_CLOSE 则会使窗口消失并关闭应用程序(如果您真的想关闭应用程序,请使用此选项)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接