Swing控件是改善為了AWT控件而發展出來的輕量級GUI控件采用的是Composite設計模式然而由於沒有清楚的分隔組件(Component)和容器(Container)的邊界就造成了Swing的幾乎每個單獨的組件都是一個容器能夠添加其他容器或者組件看似強大的功能實際上造成了大量的問題
和人的直覺非常不一致Swing的GUI上的各種組件如果添加的面板過多的話就造成各個組件的層次很深處理類似focus管理這樣的問題就很麻煩坐標的轉換也很復雜由於父子關系過多您不看代碼只看GUI憑直覺難以區分組件的父子關系
使用上的困擾Swing組件本身由於不能分清是組件還是容器很多容器方法比如setEnabled就沒有效果需要寫代碼遍歷所有子組件調用所有的子組件相同的方法而類似設置透明的方法也有這個問題如果設置某個容器透明也需要設置所有的子組件的透明屬性組件和容器的很多方法沒有很好的定義這對了解Swing結構的人不是問題但是對於熟悉別的GUI類庫的人就產生了很大的困惑因為不少容器上的方法調用後是沒有效果的
布局上的困難使用Swing開發界面的程序員會發現即使Swing提供了這麼多布局管理器然而您想通過這些布局管理器做出很專業的界面卻非常難因為布局管理器非常依賴父容器和子組件的各種狀態盡管Swing最新的版本提供了類似組件和容器間隔的方法然而還沒有被大部分布局管理器采用其實並不是布局管理器不夠強大的問題事實上很多專業的界面需要從組件級別做出良好的定義例如getPreferredSizegetMinimumSizegetMaximumSize方法這些方法的不確定性很強布局管理器不能過度依賴這些方法另外不少Swing組件會根據容器的大小進行繪制這也造成了很多不確定性很多人喜歡使用NullLayout可能就是這個原因客戶需要的是一個穩定的可預知的界面如果使用了布局管理器會發現界面在不同的系統下展示的不同
而對比不少GUI類庫您會發現他們的定義更為嚴格比方JavaME LCDUI類庫組件和容器是嚴格分開的組件的添加是嚴格限制的布局也是定義的非常嚴格的沒有布局管理器類似滾動條這些支持都在底層進行了隱藏真正減少了GUI開發者的負擔
總得來說對Composite設計模式應該慎用如果一定要用一定要良好的定義組件(Component)和容器(Container)的邊界不然很多功能會陷入沒有意義的父子遍歷例程增加了復雜性卻沒有帶來很多好處
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26380.html