2014-10-27 76 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選項...

如果對話框沒有其它強引用,它將最終被垃圾收集。

相關問題