Swing:使用頂層容器

原創做品,容許轉載,轉載時請務必以超連接形式標明文章  原始出處 、做者信息和本聲明。不然將追究法律責任。
介紹Swing頂層容器。
翻譯Using Top-Level Containers,[url]http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html[/url]
 
 
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座標排序. 玻璃面板一般用來截獲發生在頂層中的輸入動做, 而且一樣能夠用來在多重組件上進行繪畫.
相關文章
相關標籤/搜索