2014-09-29 138 views
1

我制作了一个包含JButton的JFrame(称为J1)。点击该按钮后,将打开一个新的JFrame(称为J2)。 J1也有一个ArrayList,其中包含J2以及所有已打开的其他Jframe。 J2设置为DISPOSE_ON_CLOSED 我设置为J2 a windowClosed()方法。为了进行测试,在JFrame里面我打了一圈ArrayList,直到我刚刚关闭的当前J2,并且出乎意料地当我做J2.setVisisble(true)时,J2窗口返回!如何完全关闭/删除JFrame

我也查扔了任务管理器,看到虽然打开一个新的J2,将会使整个程序消耗更多的内存,关闭每个J2不显示在任务管理器太大的区别,它看起来并不像任何内存都被释放。看起来内存消耗在几秒钟后回到“正常”,所以我怀疑这与J2有什么直接关系。

我试图打印(System.out.print)所有ArrayList每一个新J2开始时间的内容,并打开窗户,关闭它,并打开一个新的后,我得到以下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,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

'“关闭每个J2不显示在任务管理器太大的差别,......”“ - 可能是因为GC'ing需要的时候才会出现,所以虽然您的对象被标记为GC'ing,但可能因为没有必要已经被收集。在一个侧面说明 - 为什么所有的JFrames?我用过的大多数程序都会给你带来很多窗口,看起来很烦人,我想这就是为什么我通常只看到新手程序员以这种方式创建它们的原因。为什么不用CardLayout交换视图? – 2014-09-29 21:19:29

+1

'“J2.setVisisble(true)”' - 这里不足为奇。调用'dispose()'释放资源。调用'setVisible(true)'重新创建并重新使用资源。你仍然有一个对象的引用,那么如果你可以再次设置它,所以不会发生GC'ing。 – 2014-09-29 21:22:17

+0

''这意味着J2没有被完全删除!“ - 你不想把对象与资源混淆,这正是你在这里做的。您保留了对该对象的引用(否则println无法完成),因此它当然存在并且一直存在,直到引用不再存在(您不能打印任何内容),并且由于它继续当然存在打印出来会返回你所看到的。 – 2014-09-29 21:27:00

回答

0

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

+0

['System.gc()'](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc%28%29)只是一个建议。它不能保证会发生任何事情, – 2014-09-29 22:00:04

+0

是啊谢谢你指出,只是试图以最简单的方式传递信息给问的人;) – vlatkozelka 2014-09-29 22:06:06

5

我制作了一个包含JButton的JFrame(称为J1)。点击该按钮后,将打开一个新的JFrame(称为J2)。 J1还包含一个ArrayList,其中包含J2以及所有已打开的其他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,invalid,layout = javax.swing.JRootPane $ RootLayout,alignmentX = 0.0,alignmentY = 0.0,border =,flags = 16777673,maximumSize =,minimumSize =,preferredSize =],rootPaneCheckingEnabled = true]

This意思那J2完全没有被删除!

再次,你混淆了对象,只要对对象的引用存在,资源就会存在。

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

没错。

所以我只是错了,框架被删除累计时间后。

只有在没有更强的引用时才能GC'd对象,并且垃圾回收器只在感觉需要时才会执行此操作,例如内存即将用完时。

如果不是,那么我如何删除框架以引用它的方式将引用为空?

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


在旁注 - 为什么所有的JFrames?我用过的大多数程序都会给你带来很多窗口,看起来很烦人,我想这就是为什么我通常只看到新手程序员以这种方式创建它们的原因。为什么不用CardLayout交换视图?

请查看:更多The Use of Multiple JFrames, Good/Bad Practice?这个

+0

我只是在学习秋千,所以我试图全部种类的东西。但是,除了在本地创建对象之外,没有办法完全摧毁对象吗?我想要一个将对象的引用更改为null的方法,因此无法再引用它。 – 789 2014-10-01 10:01:26