我制作了一个包含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?
'“关闭每个J2不显示在任务管理器太大的差别,......”“ - 可能是因为GC'ing需要的时候才会出现,所以虽然您的对象被标记为GC'ing,但可能因为没有必要已经被收集。在一个侧面说明 - 为什么所有的JFrames?我用过的大多数程序都会给你带来很多窗口,看起来很烦人,我想这就是为什么我通常只看到新手程序员以这种方式创建它们的原因。为什么不用CardLayout交换视图? – 2014-09-29 21:19:29
'“J2.setVisisble(true)”' - 这里不足为奇。调用'dispose()'释放资源。调用'setVisible(true)'重新创建并重新使用资源。你仍然有一个对象的引用,那么如果你可以再次设置它,所以不会发生GC'ing。 – 2014-09-29 21:22:17
''这意味着J2没有被完全删除!“ - 你不想把对象与资源混淆,这正是你在这里做的。您保留了对该对象的引用(否则println无法完成),因此它当然存在并且一直存在,直到引用不再存在(您不能打印任何内容),并且由于它继续当然存在打印出来会返回你所看到的。 – 2014-09-29 21:27:00