2013-09-26 24 views
1

我有一個JPanel和一個Jlist,當用戶在列表中選擇不同的項目時,相應的組件將被添加到面板中,而之前的組件將被刪除。下面是代碼的部分:其中所述depictorPanel是JPanel中JPanel中的組件自動消失

depictorPanel.removeAll(); 
depictorPanel.invalidate(); 
depictorPanel.repaint(); 
GridBagConstraints constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
depictorPanel.add(viewer, constraints); 
viewer.setSize(depictorPanel.getSize()); 
depictorPanel.invalidate(); 
depictorPanel.repaint(); 

,並且觀看者的是組分(。順便說一句觀看者類型的VisualizationView從JUNG庫,它也繼承的JPanel推出)。

當我調整JPanel的大小(通過調整整個窗口的大小,使窗口中的所有組件都被調整大小)或最小化窗口並將其恢復時,查看器組件不見了,因爲我設置了不同depictorPanel和查看器的背景顏色。

我也處理了depictorPanel的componentResized監聽器來使查看器無效並重新繪製,但沒有運氣。

+3

爲了更好的幫助和更快的發佈一個[SSCCE](http://sscce.org/) – Reimeus

+0

您還可以採取其他兩種策略。 1)如果經常顯示'viewer',具有不同的細節,只需要一個'viewer',但刷新細節。 2)如果'viewer'也可能是'editor'或'generalSettings'(即有限的(少於50)個特定組件),則使用'CardLayout'。 –

+0

@AndrewThompson謝謝你的選擇!你是對的,我認爲使用單一的查看器,但不同的細節是一個更好的方法。使用CardLayout是不可取的,因爲要顯示的不同圖形可能是任何(大)數字。此外,我仍然想知道爲什麼我目前的代碼不起作用。 –

回答

1

我終於發現,使用佈局管理器(GridBagLayout的)工作方法:

GridBagConstraints constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.gridx = 0; 
constraints.gridy = 0; 
constraints.weightx = 1; 
constraints.weighty = 1; 
depictorPanel.add(currentViewer, constraints); 
depictorPanel.revalidate(); 

此代碼是我所期待的效果。我認爲我的問題不是很瞭解每個佈局管理器(因爲我對Java相對較新)。

謝謝大家!我通過這個問題(和SSCCE)瞭解了一些關於Java的知識:-)

0

我找到了解決我的問題的方法,即不使用任何佈局管理器手動管理佈局(手動設置位置和大小,並在調整depictorPanel大小時調整大小)。

+0

*「我找到了解決我的問題的解決方法..「*解決方法將產生10個新問題,Java GUI可能需要在多種平臺上工作,使用不同的屏幕分辨率和使用不同的PLAF,因此它們不利於組件的準確放置。一個強大的圖形用戶界面,而不是使用佈局管理器,或[它們的組合](http://stackoverflow.com/a/5630271/418556),以及[白色空間]的佈局填充和邊框(http://stackoverflow.com/q/17874717/418556) –

+0

@AndrewThompson我明白你的意思,如果他們工作的話,我確實想用佈局管理器!但據我所知,Java應該被編譯一次並在任何地方運行,所以我假設如果代碼在這裏工作,它也應該在那裏工作 –

+0

*「Java應該被編譯一次並在任何地方運行」*人們聽到在批評中說Java反而是'編譯一次,*測試無處不在*'。你似乎沒有得到的一點是,'佈局經理'***是*** Java的方式是提供「編譯一次,隨處運行」的理念和佈局組件,而'null'佈局管理器則是......相反,這將在各種實現上突破。在使用無佈局時,您應該嘗試弄清楚如何提供在[此答案](http://stackoverflow.com/a/5630271/418556)中看到的GUI。它顯示了使用它們的能力。 –