2012-04-10 101 views
1

我見過兩種做有神論的方式,他們都似乎工作,但我只是想知道,如果一個更好的做法比另一個更好。Java - 向JFrame添加組件

例如,一個名爲JFramemyFrame你可以這樣做:

myFrame.add(new JButton("OK")); 

而且你還可以這樣做:

Container c = myFrame.getContentPane(); 
c.add(new JButton("OK")); 

是這些 '正確' 呢?

回答

5

JFrame

JFrame類類Javadoc逐字複製與框架稍微不兼容。像所有其他JFC/Swing頂級容器一樣,JFrame包含一個JRootPane作爲其唯一的孩子。通常,根窗格提供的內容窗格應包含JFrame顯示的所有非菜單組件。這與AWT框架案例不同。作爲方便添加及其變體,必要時,remove和setLayout已被覆蓋以轉發到contentPane。這意味着你可以這樣寫:

frame.add(child); 

那孩子將被添加到contentPane。內容窗格將始終爲非空值。嘗試將其設置爲null將導致JFrame拋出異常。默認的內容窗格將設置一個BorderLayout管理器。有關添加,刪除和設置JFrame的LayoutManager的詳細信息,請參閱RootPaneContainer。

所以兩者是等價的,都是正確的

2

從Java5中不需要

  • 添加JComponentsContentPane,只是JFrame.add(JComponent)

  • JFrame已經實施BorderLayout ,那麼myFrame.add(new JButton("OK"));被放置到CENTER區域

1

我會確定地說,

Container c = myFrame.getContentPane(); 
c.add(new JButton("OK")); 

是最實用的一個。由於您很可能稍後需要使用容器,因此您不需要稍後再次寫入容器。例如,如果您需要爲框架設置另一個佈局,則會使用它。但如前所述,兩者都可以使用。

+1

每一個不必要的字母都是噪音和噪音導致不可維護的代碼:-)雖然contentPane的屬性只能直接訪問(如fi背景,不透明..),但佈局不是其中的一個,因此您的參數咳嗽...... – kleopatra 2012-04-10 12:11:13