2012-05-22 42 views
14

已經有StackOverflow上其中一個用戶問這樣的問題很多次......CardLayout與手動添加/刪除JPanels有什麼特別之處?

我有一個包含一個孩子JPanelJPanel。當用戶點擊 按鈕時,子JPanel應更改爲不同的JPanel。我如何 達到此目的。

通常情況下,用戶實際上已經試圖實現此問題,但無法使其工作。

每當我回答這個問題,我告訴他們做這樣的事情(簡言之)...

JPanel myFrame = new JPanel(); 
myFrame.remove(oldPanel); 
myFrame.add(newPanel); 

我認爲這是相當合理的答案,我個人已經在許多使用該我自己的Java項目沒有問題。然而,我總是會爲我的答案得到低價,而每個人都只是說「使用CardLayout」。

所以我的問題是,爲什麼大家對CardLayout如此着迷,以至於我的回答值得讚賞呢?爲什麼我應該選擇使用CardLayout而不是使用上面的代碼添加/刪除面板?

作爲進一步的問題,你是否仍然建議CardLayout有動態JPanel接口。例如,我的大多數程序都實現了一個自定義插件框架,其中可能有成百上千個JPanels,但我只在實際需要時才加載和顯示面板。對於程序的正常使用,絕大多數面板永遠不會被加載或需要。對於這種情況,我的編碼方法是否是最好的解決方案,因爲據我所知CardLayout會要求我實際創建JPanels的全部,即使絕大多數永遠不會被使用?

+6

我認爲你已經做了很好的工作,以建設性的方式表達你的問題。我希望它不會結束。 –

+0

非常感謝 - 我故意試圖將其作爲一個有建設性的問題,並很高興得到一些好的反饋。 – wattostudios

+4

*「但我只加載和顯示面板,因爲它們實際上是需要的。」*惰性實例化也可以與'CardLayout'一起使用,並且它支持數千個面板。 –

回答

14
  • 隨着CardLayout,它更容易具有鬆散耦合(儘管不是不可能的滾你自己的)
  • 隨着CardLayout,卡持有人的首選大小是,它擁有最大的信用卡的。
  • CardLayout很難成立,並允許幾乎不重要的連續組件交換其next()prev()方法。
  • 您可以輕鬆地將所需組件與常量關聯 - 無需爲此創建Map<String, Component>,因爲它已經在您身邊。我很少使用這個枚舉。
  • 交換組件時不需要記得調用repaint()revalidate()
  • 它的構建和允許輕鬆地重新使用組件。

我無法解釋了反對票的原因,雖然,除非他們不高興,你沒有提到需要記住交換組件時調用repaint()revalidate()。如果他們有足夠的勇氣作出迴應,你將不得不詢問低級選民。

+2

感謝大家的迴應,我對這些觀點有一些直覺,並且提出了許多使用'CardLayout'的好例子。 – wattostudios

+2

可能會發現相關示例[此處](http://stackoverflow.com/a/5655843/230513)和[這裏](http://stackoverflow.com/a/6432291/230513)。 – trashgod

+0

@Watto:不客氣! –

8

CardLayout已經過全面測試並證明可行。它正確地獲得component-tree lock並執行組件validation以確保沒有任何問題可以出錯。在大多數情況下,您的解決方案在某些情況下會失敗。

這一切都歸功於重新發明輪子:爲什麼你想要這樣一個經過時間考驗的課程已經可用?

+1

是,很好的建議1+ –

+1

這也提出了一些好點,謝謝你的反饋。我當然可以理解,這將有助於提供一定的失敗保證。關於重新發明輪子,我想我從來沒有想到'CardLayout'會適合我的目的,而且我對Java的低級別做了相當多的修改,所以對我來說這不是一個真正的飛躍使用更低級別的add()'''remove()'選項。感謝您的好點子! – wattostudios

相關問題