2014-10-27 77 views
0

我有一个JFrame(EC_GUI.main),然后我创建几个JDialog s到我添加JPanel,传递JFrame作为所有者。的JDialog设置,但仍然在jFrame.getOwnedWindows

我现在的检测,如果这些JDialogs都是通过jFrame.getOwnedWindows()开了,因为我不能让他们通过这个

EC_GUI.main.getComponentCount() 1 
javax.swing.JRootPane[,0,0,755x1005,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=] 

EC_GUI.main.getRootPane().getComponentCount() 2 
javax.swing.JPanel[null.glassPane,0,0,755x1005,hidden,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777217,maximumSize=,minimumSize=,preferredSize=] 
javax.swing.JLayeredPane[null.layeredPane,0,0,755x1005,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,optimizedDrawingPossible=true] 

EC_GUI.main.getContentPane().getComponentCount() 1 
ec.gui.dialogs.template.EC_BorderPanel[,0,0,755x1005,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,[email protected],flags=9,maximumSize=,minimumSize=,preferredSize=] 

之一,但我得到他们,如果我查询的过程ownedWindows

EC_GUI.main.getOwnedWindows().length 1 
ec.gui.dialogs.visivilityfield.EC_VrPresetDialog$1[dialog0,385,254,502x511,invalid,hidden,layout=java.awt.BorderLayout,MODELESS,title=Virtual Reality Presets,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,502x511,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] 

我注意到,即使我打电话jDialog.dispose()我仍然有一个参考,所以如果我打开和关闭,让我们说3次,我JDialog S的一个,我得到

EC_GUI.main.getOwnedWindows().length 3 
ec.gui.dialogs.visivilityfield.EC_VrPresetDialog$1[dialog1,385,254,502x511,invalid,hidden,layout=java.awt.BorderLayout,MODELESS,title=Virtual Reality Presets,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,502x511,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] 
ec.gui.dialogs.visivilityfield.EC_VrPresetDialog$1[dialog2,385,254,502x511,invalid,hidden,layout=java.awt.BorderLayout,MODELESS,title=Virtual Reality Presets,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,502x511,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] 
ec.gui.dialogs.visivilityfield.EC_VrPresetDialog$1[dialog3,385,254,502x511,invalid,hidden,layout=java.awt.BorderLayout,MODELESS,title=Virtual Reality Presets,defaultCloseOperation=DO_NOTHING_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,502x511,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] 

这是正常的吗?

+0

您正在'JPanel'与'JDialogs'混合使用,重写这个问题以清楚。另外,发布[MCVE](http://stackoverflow.com/help/mcve)。 – user1803551 2014-10-27 09:51:13

+0

@ user1803551 ok,gimme 5m – elect 2014-10-27 09:57:16

+1

您阅读了[JavaDocs](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#dispose()),您不会那么做,如果配置正确,'dispose'将释放窗口正在使用的本地资源,这不会“处理”对象,您可以通过调用'setVisble'来重新显示窗口。你可以检查'isDisplayable'或更可靠的'isVisible'选项... – MadProgrammer 2014-10-27 10:10:17

回答

0

通过JavaDocs你不会看到,如果配置正确,dispose将释放窗口正在使用的本地资源,这不会“处理”对象,您可以通过调用setVisible来重新显示窗口。

您可以检查isDisplayable(这将让你知道,如果窗口仍有引用到它的本地对等体)或更可靠isVisible选项...

如果对话框没有其它强引用,它将最终被垃圾收集。

相关问题