4. CardLayout
CardLayout布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據整個容器的大小,但是每層只允許放置一個組件,當然每層都可以利用Panel來實現復雜的用戶界面。牌布局管理器(CardLayout)就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,每一張牌就相當于牌布局管理器中的每一層。
例7
1 import java.awt.*;
2 import java.awt.event.*; //事件處理機制,下一節的內容
3 public class ThreePages implements MousListener {
4 CardLayout layout=new CardLayout(); //實例化一個牌布局管理器對象
5 Frame f=new Frame("CardLayout");
6 Button page1Button;
7 Label page2Label; //Label是標簽,實際上是一行字符串
8 TextArea page3Text; //多行多列的文本區域
9 Button page3Top;
10 Button page3Bottom;
11 public static void main(String args[])
12 {
13 new ThreePages().go();
14 }
15 public void go()
16 {
17 System.out.println("123");
18 f.setLayout(layout); //設置為牌布局管理器layout
19 f.add(page1Button=new Button("Button page"),"page1Button"); /*第二個參數"page1Button"表示的是你對這層牌所取的名字*/
20 page1Button.addMouseListener(this); //注冊監聽器
21 f.add(page2Label=new Label("Label page"),"page2Label");
22 page2Label.addMouseLisener(this); //注冊監聽器
23 Panel panel=new Panel();
24 panel.setLayout(new BorderLayout());
25 panel.add(page3Text=new TextArea("Composite page"),"Center");
26 page3Text.addMouseListener(this);
27 panel.add(page3Top=new Button("Top button") , "North");
28 page3Top.addMouseListener(this);
29 panel.add(page3Bottom=new Button("Bottom button") ,"South");
30 page3Bottom.addMouseListener(this);
31 f.add(panel,"panel");
32 f.setSize(200,200);
33 f.setVisible(true);
34 }
35 //……
36 }
37
38
5.容器的嵌套
在復雜的圖形用戶界面設計中,為了使布局更加易于管理,具有簡潔的整體風格,一個包含了多個組件的容器本身也可以作為一個組件加到另一個容器中去,容器中再添加容器,這樣就形成了容器的嵌套。下面是一個容器嵌套的例子。
例8
1 import java.awt.*;
2 public class ExGui3{
3 private Frame f;
4 private Panel p;
5 private Button bw,bc;
6 private Button bfile,bhelp;
7 public static void main(String args[])
8 {
9 ExGui3 gui = new ExGui3();
10 gui.go();
11 }
12 public void go(){
13 f = new Frame("GUI example 3");
14 bw=new Button("West");
15 bc=new Button("Work space region");
16 f.add(bw,"West");
17 f.add(bc,"Center");
18 p = new Panel();
19 f.add(p,"North");
20 bfile= new Button("File");
21 bhelp= new Button("Help");
22 p.add(bfile);
23 p.add(bhelp);
24 f.pack();
25 f.setVisible(true);
26 }
27 }
28
小 結:
1.Frame是一個頂級窗口。Frame的缺省布局管理器為BorderLayout。
2.Panel 無法單獨顯示,必須添加到某個容器中。 Panel 的缺省布局管理器為FlowLayout。
3.當把Panel 作為一個組件添加到某個容器中后,該Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某個區域顯示多個組件,達到設計復雜用戶界面的目的 。
4.如果采用無布局管理器 setLayout(null),則必須使用setLocation(),setSize(),setBounds()等方法手工設置組件的大小和位置,此方法會導致平臺相關,不鼓勵使用。