Swing提供3種頂層容器類:JFrame,JDialog,JApplet。當使用這三個類時,你必須注意以下幾點:
1.為了顯示在屏幕上,每個GUI組件必須是包含層次(containment hierarchy)的一部分。包含層次是組件的一個樹型結構,最頂層的容器是它的根。
2.每個GUI組件只能被包含一次。如果一個組件已經在一個容器中,這時試圖將它加入到一個新的容器,則這個組件會從第一個容器移除,並加入到第二個容器中。
3.每個頂層容器都有一個內容面板(content pane),一般情況下,這個內容面板會包含(直接或間接地)所有頂層容器GUI的可視組件。
4.可以在頂層容器中加入一個菜單條(menu bar)。通常這個菜單條被放置在頂層容器中,但在內容面板外。
下面這張圖片是通過應用程序創建的一個frame。這個frame包含一個綠色的菜單(空菜單),在這個frame的內容面板上有一個巨大的黃色空標簽。
這個例子的源代碼見TopLevelDemo.java。下圖是這個例子GUI的包含層次。
1.頂層容器與包含層次
每個使用Swing組件的程序都至少有一個頂層容器。這個頂層容器是包含層次的根節點—這個層次會包含所有將在這個頂層容器中出現的Swing組件。
通常情況下,一個單獨的基於Swing GUI的應用程序至少有一個包含層次,且它的根節點是JFrame。舉例來說,如果一個應用程序擁有一個窗口和兩個對話框,那麼這個應用程序將會有三個包含層次,也即會有三個頂層容器。一個包含層次將JFrame作為它的根節點,兩外兩個包含層次各有一個JDialog作為它的根節點。
一個基於Swing組件的小程序(applet)至少含有一個包含層次,並且可以確定其中必有一個是以JApplet作為其根節點的。例如,一個小程序帶有一個對話框,則它會有兩個包含層次。在浏覽器窗口中的組件將會置於一個包含層次,它的根節點是一個JApplet對象。對話框會有一個包含層次,它的根節點是一個JDialog對象。
2.將組件加入到內容面板中
下面的代碼操作是上面的例子中得到frame的內容面板並加入黃色標簽:
frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
如代碼所示,必須先找到頂層容器的內容面板,通過方法getContentPane實現。默認的內容面板是一個簡單的中間容器,它繼承自JComponent,使用一個BorderLayout作為它的面板管理器。
定制一個內容面板很簡單—設置面板管理器或添加邊框。這裡必須注意,getContentPane方法將返回一個Container對象,而不是JComponent對象。這意味著如果需要利用JComponent的部分功能,還必須將返回值進行類型轉換或創建你自己的組件來作為內容面板。我們的實例通常采用的是第二種方式. 因為第二種方法比較清楚明朗。 另一種我們有時會使用的方法就是簡單地將一個自己定義組件添加進內容面板, 完全遮蓋住內容面板。
如果你創建你自己的內容面板, 那麼請注意確認它是不透明的. 一個不透明的JPanel將是一個不錯的選擇. 注意, 默認情況下JPanel的布局管理為FlowLayout, 你或許會想要用其它的布局管理器替換它。
為了使一個組件成為內容面板, 你需要使用頂層容器的setContentPane方法, 例如:
//Create a panel and add components to it.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);
//Make it the content pane.
//contentPane.setOpaque(true);
topLevelContainer.setContentPane(contentPane);
注意: 不要使用透明的容器作為內容面板, 如JScrollPane, JSplitPane和JTabbedPane. . 一個透明的內容面板將導致組件混亂. 盡管你可以使任何的透明的Swing組件通過setOpaque(true)方法來使其不透明化, 但當一些組件被設置成完全不透明後看上去會不太對勁. 例如, 一個標簽面板.
3.添加一個菜單欄 (Adding a Menu Bar)
從理論上來講每一個頂層容器都可以有一個菜單欄. 但事實表明菜單欄僅出現於Frame或者Applet中. 為達到添加一個菜單欄到頂層容器, 你需要創建一個JMenuBar對象, 組裝上一些菜單, 然後呼叫setJMenuBar方法. TopLevelDemo實例通過以下代碼添加一個菜單欄到它的Frame中.
frame.setJMenuBar(cyanMenuBar);
4.根容器 (The Root Pane)
每個頂層容器都依賴於一個隱式的稱為根容器的中間容器. 這個根容器管理著內容面板和菜單欄, 並且連同兩個或者兩個以上的其它容器(見圖中Layered Pane等). 你通常不需要了解關於使用Swing組件根容器方面的知識. 然而, 如果你想截獲鼠標的點擊或者在多重組件上進行繪畫動作, 那麼你需要知曉根容器.
下圖所示由頂層容器某個Frame(也可以是其它任何頂層容器)容器中可能出現的所有中間容器:
上文已經講述了關於內容面板與可選的菜單欄的內容,此處不再復述. 根容器中包含的另外兩個組件, 是布局面板和玻璃面板. 布局面板直接包含菜單欄和內容面板, 並且允許你對所添加的其它組件進行Z坐標排序. 玻璃面板通常用來截獲發生在頂層中的輸入動作, 並且同樣可以用來在多重組件上進行繪畫.
本文出自 51CTO.COM技術博客
附件下載:
TopLevelDemo.java:
http://zhangjunhd.blog.51cto.com/attachment/200707/113473_1185278253.txt