789*_*789 1 java swing frame jframe
我制作了一个J1包含JButton 的JFrame(称之为).单击该按钮时,J2将打开一个新的JFrame(调用它).
J1还有一个包含的ArrayList J2,以及所有其他已打开的Jframe.
J2被设定为DISPOSE_ON_CLOSED
我为设置J2一个的windowClosed()方法.为了测试,我在循环里面的JFrame扔ArrayList,直到我获得了当前的J2刚关闭,而令人惊讶的,当我做J2.setVisisble(true)了J2窗口的回报!
我还检查了扔任务管理器,并看到虽然开了一个新的J2,会使整个程序消耗更多的RAM,关闭每个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]
Run Code Online (Sandbox Code Playgroud)
这意味着J2没有完全删除!
dispose()假设JFrame 方法
释放此Window,其子组件及其所有子组件使用的所有本机屏幕资源.也就是说,这些组件的资源将被销毁,它们使用的任何内存都将返回给操作系统,并且它们将被标记为不可显示.
所以我只是错了,并且框架将被删除并且总和更晚.
如果没有,那么我如何删除框架,以便引用它就像引用null?
我制作了一个包含JButton的JFrame(称之为J1).单击该按钮时,将打开一个新的JFrame(称为J2).J1还有一个包含J2的ArrayList,以及所有其他打开的Jframe.J2设置为DISPOSE_ON_CLOSED我为J2设置了一个windowClosed()方法.为了测试,我在循环的JFrame中抛出了ArrayList,直到我到达刚刚关闭的当前J2,并且令人惊讶的是当我执行J2.setVisisble(true)时,J2窗口返回!
关闭JFrame和disposing不会破坏JFrame对象,而是释放系统资源,即在操作系统上显示窗口所需的资源.这与对象本身完全不同.当您调用setVisible(true)已处理的JFrame时,将重新创建资源,并重新显示该窗口.没有对象被创建或销毁.
我还检查了扔任务管理器,并看到虽然打开了一个新的J2,会使整个程序消耗更多的RAM,关闭每个J2在任务管理器上没有显示太大差异,它看起来不像任何内存被释放.看起来几秒后内存消耗会回到"正常",所以我怀疑这与J2有什么关系.
这并不奇怪.
我每次启动一个新的J2时都尝试打印(System.out.print)所有的ArrayList内容,打开一个窗口,关闭它,然后打开一个新窗口,我得到以下的messgae:
home.ATMmachine [frame0,252,198,620x420的,无效的,隐藏的,布局= java.awt.BorderLayout中,标题= ATM机一号,可调整大小,正常的,defaultCloseOperation = DISPOSE_ON_CLOSE,的rootPane = javax.swing.JRootPane中的[,9,38,602x373的,无效的,布局= javax.swing.JRootPane中$ RootLayout,alignmentX = 0.0,alignmentY = 0.0,边界=,=标志16777673,MAXIMUMSIZE =,=的minimumSize,首选大小=],rootPaneCheckingEnabled =真]
这意味着J2没有完全删除!
同样,您会混淆对象,只要对象存在的引用和资源就会存在.
JFrame dispose()方法假定释放此Window,其子组件及其所有子组件使用的所有本机屏幕资源.也就是说,这些组件的资源将被销毁,它们使用的任何内存都将返回给操作系统,并且它们将被标记为不可显示.
究竟.
所以我只是错了,并且框架将被删除并且总和更晚.
当对象没有更强引用时,对象只能是GC'd,而垃圾收集器只在感觉需要这样做时才这样做,例如当内存即将耗尽时.
如果没有,那么我如何删除框架,以便引用它就像引用null?
就像任何其他对象一样.你可以在本地创建一个,但要小心,因为Swing监听器有办法创建你认为应该很弱的强引用,因此使对象持续的时间比你想要的长.
在旁注 - 为什么所有JFrames?我用过的大多数程序都会让你觉得很烦人,我想这就是为什么我通常只会看到新手程序员以这种方式创建的程序.为什么不用CardLayout交换视图呢?
请查看:使用多个JFrame,好/坏的做法?了解更多
| 归档时间: |
|
| 查看次数: |
2965 次 |
| 最近记录: |