如何完全关闭/删除JFrame

时间:2014-09-29 20:59:55

标签: java swing jframe frame

我制作了一个包含JButton的JFrame(称之为J1)。单击该按钮时,将打开一个新的JFrame(称为J2)。 J1还有一个包含J2的ArrayList,以及所有其他已打开的Jframe。 J2设置为 DISPOSE_ON_CLOSED 我为J2设置了 windowClosed()方法。为了进行测试,我在循环的JFrame中抛出了ArrayList,直到我到达刚刚关闭的当前J2,并且当我J2.setVisisble(true) J2窗口返回时出人意料!

我还检查了任务管理器,看到虽然打开一个新的J2,但会使整个程序消耗更多的RAM,关闭每个J2并没有显示出很大的差别任务管理器,它看起来不像任何内存被释放。看起来内存消耗正在回归正常情况。几秒后,我怀疑这与J2直接有关。

我每次启动新的System.out.print时都尝试打印(ArrayList)所有J2内容,打开窗口,关闭它并打开新窗口后,我得到了以下的杂物:

home.ATMmachine[frame0,252,198,620x420,invalid,hidden,layout=java.awt.BorderLayout,title=ATM Machine No.1,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,9,38,602x373,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

这意味着J2并未完全删除!

JFrame dispose()方法假设为

  

释放此Window,其子组件及其所有子项使用的所有本机屏幕资源。也就是说,这些组件的资源将被销毁,它们消耗的任何内存都将返回给操作系统,并且它们将被标记为不可显示。

所以我错了,并且这段时间被删除了。

如果没有,那么我怎样才能删除框架,引用它就像引用null一样?

2 个答案:

答案 0 :(得分:5)

  

我制作了一个包含JButton的JFrame(称之为J1)。单击该按钮时,将打开一个新的JFrame(称为J2)。 J1还有一个包含J2的ArrayList,以及所有其他打开的Jframe。 J2设置为DISPOSE_ON_CLOSED我为J2设置了一个windowClosed()方法。为了测试,我在循环的JFrame中抛出了ArrayList,直到我到达刚刚关闭的当前J2,并且当我执行J2.setVisisble(true)时,J2窗口返回了!

关闭JFrame并进行处理不会破坏JFrame对象,而是释放系统资源,即在操作系统上显示窗口所需的资源。这与对象本身完全不同。当您在已处置的JFrame上调用setVisible(true)时,将重新创建资源,并重新显示该窗口。没有对象被创建或销毁。

  我还检查了扔任务管理器,并看到虽然开了一个新的J2,会让整个程序消耗更多的RAM,关闭每个J2在任务管理器上没有显示太大差异,它看起来不像任何记忆被释放了。看起来几秒后内存消耗会回到“正常”状态,所以我怀疑这与J2有什么关系。

毫不奇怪。

  

每次启动新J2时,我都尝试打印(System.out.print)所有ArrayList内容,打开窗口,关闭它,打开一个新窗口后,我得到以下的messgae:

     

home.ATMmachine [frame0,252,198,620x420,invalid,hidden,layout = java.awt.BorderLayout,title = ATM Machine No.1,resizable,normal,defaultCloseOperation = DISPOSE_ON_CLOSE,rootPane = javax.swing.JRootPane [,9 ,38,602x373,无效,布局= javax.swing.JRootPane $ RootLayout,alignmentX = 0.0,alignmentY = 0.0,border =,flags = 16777673,maximumSize =,minimumSize =,preferredSize =],rootPaneCheckingEnabled = true]

     

这意味着J2没有完全删除!

同样,你会混淆对象,只要存在对象的引用和资源就会存在。

  

假设JFrame dispose()方法   释放此Window,其子组件及其所有子组件使用的所有本机屏幕资源。也就是说,这些组件的资源将被销毁,它们使用的任何内存都将返回给操作系统,并且它们将被标记为不可显示。

完全。

  

所以我错了,并且这段时间被删除了。

当对象没有更多强引用时,对象只能是GC'd,而垃圾收集器只在感觉需要这样做时才这样做,例如当内存即将耗尽时。

  

如果没有,那么我怎样才能删除框架,引用它就像引用null一样?

就像任何其他物体一样。你可以在本地创建一个,但要小心,因为Swing监听器有办法创建你认为应该很弱的强引用,因此使对象持续的时间比你想要的长。


在旁注 - 为什么所有JFrame?我用过的大多数程序都会让你觉得很烦人,我想这就是为什么我通常只会看到新手程序员以这种方式创建的程序。为什么不用CardLayout交换视图?

请查看:The Use of Multiple JFrames, Good/Bad Practice?了解更多信息

答案 1 :(得分:0)

框架j2仍由一个指针在ArrayList中引用,所以垃圾收集器还不能处理它...尝试从arraylist中删除指针,然后即使j2仍在RAM中,它不会在你的程序中有任何引用,因此垃圾收集器应该在下一次传递中删除它,或者如果你调用system.gc()。