New Document
組件在容器中的位置和尺寸是由布局管理器來決定的。所有的容器都會引用一個布局管理器執行個體,通過它來自動進行組件的布局管理。
預設布局管理器
當一個容器被建立後,它們有相應的預設布局管理器。Window、Frame和Dialog的預設布局管理器是BorderLayout,Panel和
Applet的預設布局管理器是FlowLayout。 可以通過setLayout()方法來重新設定容器的布局管理器。例如把一個Frame的布局管理器設為FlowLayout。
Frame f=new Frame("hello");
f.setLayout(new FlowLayout());
取消布局管理器
如果不希望通過布局管理器來管理布局,可以調用容器的setLayout(null)方法, 這樣布局管理器就被取消了。
接下來必須調用容器中每個組件的setLocation()、setSize()、或setBounds()方法,為這些組件在容器中一一定位。
和布局管理器管理方式不同的是,這種手工布局將導致圖形介面的布局不再是和平台無關的。相反,圖形介面的布局將依賴於作業系統環境。
布局管理器種類
java.awt包提供了5種布局管理器:FlowLayout 流式布局管理器、Borderlayout 邊界布局管理器、GridLayout 網格布局管理器、Cardlayout 卡片 布局管理器和GridBagLayout網格包布局管理器。另外javax.swing包還提供了一種BoxLayout 布局管理器。
FlowLayout 流式布局管理器
FlowLayout 是最簡單的布局管理器,按照組件的添加次序將它們從左至右地放置在容器中。當到達容器邊界時,組件將放置在下一行中。
FlowLayout 運行以靠左對齊、 置中對齊(預設)或靠右對齊的方式排列組件。
FlowLayout的特性如下: 不限制它所管理的組件的大小,而是允許它們有自己的最佳大小。 當容器被縮放時,組件的位置可能會變化,但組件的大小不改變。
FlowLayout的構造方法如下:
- FlowLayout();
- FlowLayout(int align);
- FlowLayout(int align,int hgap,int vgap);
參數align用來決定組件在每行中相對於容器的邊界的對齊,可選值有:FlowLayout.LEFT(靠左對齊)、
FlowLayout.RIGHT(靠右對齊)和FlowLayout.CENTER(置中對齊)。參數hgap和參數vgap 分別設定組件之間的水平和垂直間隙。
BorderLayout邊界布局管理器
BorderLayout為在容器中放置組件提供了一個稍微複雜的布局方案。BorderLayout把容器分為5個地區:東、南、西、北和中。
北佔據容器的上方,東佔據容器的右側,依次類推。中地區是在東、南、西和北都填滿後剩下的地區。
BorderLayout的特性如下:
- 在位於東和西地區的組件保持最佳寬度,高度被垂直展開至和所在地區一樣高;
位於南和北地區的組件保持最佳高度,寬度被水平展開至和所在地區一樣寬;
位於中地區的組件的寬度和高度都被展開至和所在地區一樣的大小。
- 當視窗垂直展開時,東、西和中地區也展開;而當視窗水平展開時,南、北和中地區也展開;
- 對於容器的東、南、西和北地區,如果某個地區沒有組件,則這個地區面積為零;對於中地區,不管有沒有
組件,BorderLayout都會為它分配空間,如果該地區沒有組件,在中地區顯示容器的背景顏色。
- 當容器被縮放時,組件所在的相對位置不變,但組件大小改變。
- 如果在某個地區添加的組件不止一個,則只有最後添加的一個是可見的。
BorderLayout的構造方法如下:
- BorderLayout()
- BorderLayout(int hgap,int vgap)
參數hgap和參數vgap分別設定組件之間的水平和垂直間隙。
對於採用BorderLayout的容器,當它用add()方法添加一個組件時,可以同時為組件指定在容器中的地區。
void add(Component comp,Object constraints)
這裡的 constraints是 String類型,可選值為BorderLayout提供的5個常量。
- Borderlayout.NORTH:北地區,值為"North"。
- Borderlayout.SOUTH:南地區,值為"South"。
- Borderlayout.EAST:東地區,值為"East"。
- Borderlayout.WEST:西地區,值為"West"。
- Borderlayout.CENTER:中地區,值為"Center"。
Frame的預設布局管理器就是BorderLayout。以下代碼把Button方在Frame的北地區。
Frame f=new Frame("Test");
f.add(new Button("b1",BorderLayout>NORTH));
//或者;f.add(new Button("b1","North"));
如果不指定add()方法的constraints參數,在預設情況下把組件放在中地區。以下代碼向Frame的
中地區加入兩個Button,但是只有最後加入的Button是可見的。
Frame f=new Frame("Test");
f.add(new Button("b1"));
f.add(new Button("b2"));
f.setSize(100,100);
f.setVisible(true);
在Frame中只有b2按鈕是可見的,它佔據了Frame的中地區,由於其他地區沒有組件,因此其他地區的面積都為零
,b2按鈕自動向垂直和水平方向展開,佔據了Frame的整個空間。
Gridlayout網格布局管理器
GridLayout將容器分割成許多行和列,組件被填充到每個網格中。添加到容器中的組件首先放置在左上方的網格中,
然後從左至右放置其他組件,直至佔滿該行的所以網格,接著繼續在下一行中從左至右放置組件。
GridLayout的特性如下:
- 組件的相對位置不隨地區的縮放而改變,但組件的大小會隨之改變。組件始終佔據網格的整個地區。
GridLayout總是忽略組件的最佳大小,所以組件的寬度相同,高度也相同。
- 將組件用add()方法添加到容器中的先後順序決定它們佔據哪個網格。
- GridLayout從左至右、從上到下將組件填充到容器的網格中。
GridLayout的構造方法如下:
- GridLayout()
- GridLayout(int rows,int cols)
- GridLayout(int rows,int cols,int hgap,int vgap)
參數rows代表行數,參數cols代表列數。參數hgap和vgap規定水平和垂直方向的間隙。水平間隙是指網格之間的水平距離,
垂直間隙是指網格之間的垂直距離。
CardLayout卡片布局管理器
CardLayout將介面看做一系列的卡片,在任何時候只有其中一個卡片是可見的,
這張卡片佔據容器的整個地區。CardLayout的構造方法如下:
- Cardlayout()
- Cardlayout(int hgap,int vgap)
參數hgap表示卡片和容器的左右邊界之間的間隙,參數vgap表示卡片和容器的上下邊界的間隙。
對於採用Cardlayout的容器,當用add()方法添加一個組件時,需要同時為組件指定所在卡片的名字。
void add(Component comp,Object constraints)
以上constraints參數是一個字串,表示卡片的名字。在預設的情況下,容器顯示第一個用add()方法加入到
容器中的組件,也可以通過CardLayout的show(Container parent,String name)方法指定顯示哪張卡片,參數
parent指定容器,參數name指定卡片的名字。
GridBagLayout網格包布局管理器
GridBagLayout在網格的基礎上提供更為複雜的布局,和GridLayout不同,GridBagLayout允許容器中各個
組件的大小各不相同,還允許單個組件所在的顯示地區佔據多個網格。
使用GridBagLayout布局管理器的步驟如下:
(1)建立GridBagLayout布局管理器,並使容器採用該布局管理器。
GridBagLayout layout =new GridBagLayout();
container.setlayout(layout);
(2)建立一個GridBagConstraints對象。
GridBagConstraints constraints=new GridBagConstraints();
(3)為第一個添加到容器中的組件設定GridBagConstraints的各種屬性。
constraints.gridx=1;//設定網路的左上方的x座標
constraints.gridy=1;//設定網路的左上方的y座標
constraints.gridwidth=1;//設定網路的寬度
constraints.gridheight=1;//設定網路的高度
(4)通知布局管理器放置第一個組件時的GridBagConstraints資訊。
layout.setConstraints(component1,constraints);
(5)向容器中添加第一個組件。
container.add(component1);
(6)重複步驟(3)~步驟(5),將每個組件都添加到容器中。
GridBagConstraints包含了如何把一個組件添加到容器中的布局資訊。只需要建立一個GridBagConstraints對象,
在每次向容器中加入組件時,先設定GridBagConstraints對象的屬性,這個GridBagConstraints對象可以被多次
重用。
GridBagConstraints具有以下屬性。
(1)gridx和gridy:這些屬性指定了組件的顯示地區的左上方的列和行。如果把gridx或gridy設為GridBagConstraints
.RELATIVE(預設值),表示當前組件緊跟在上一個組件的後面。
(2)gridwidth和gridheight:這些屬性指定了組件的顯示地區佔據的列數和行數,預設值為1.如果把Gridwidth或
gridheigth設為GridBagConstraints.REMAINDER,表示當前組件在其行或列上為最後一個組件。如果把gridwidth或gridheight
設為GridBagConstraints.RELATIVE,表示當前組件在其行或列上為倒數第二個組件。
(3)fill:該屬性在某組件的顯示地區大於它所要求的大小時被使用。fill決定了是否及如何改變組件的大小,有效值包括:
- GridBagConstraints.NONE-預設,不改變組件的大小。
- GridBagConstraints.HORIZONTAL-使組件足夠大,以填充其顯示地區的水平方向,但不改變其高度。
- GridBagConstraints.VERTICAL-使組件足夠大,以填充其顯示地區的垂直方向,但不改變其寬度。
- GridBagConstraints.BOTH-使組件足夠大,以填充其整個顯示地區。
(4)ipadx和ipady:這些屬性指定了內部填充的大小,即在該組件的最小尺寸基礎上還需要增加多少。
組件的寬度必須至少為其最小寬度加ipadx×2個像素(因為填充作用於組件的兩邊)。同樣,組件的高度必須至少為其最小高度加ipady×2個像素。
(5)insets:該屬性指定了組件的外部填充大小,即組件與其顯示地區邊界之間的最小空間大小。
(6)anchor:該屬性在某組件大小小於其顯示地區時使用。anchor決定了組件放置在該地區中的位置。有效值包括;
- GridBagConstraints.CENTER(預設值)
- GridBagConstraints.NORTH
- GridBagConstraints.NORTHEAST
- GridBagConstraints.EAST
- GridBagConstraints.SOUTHEAST
- GridBagConstraints.SOUTH
- GridBagConstraints.SOUTHWEST
- GridBagConstraints.WEST
- GridBagConstraints.NORTHWEST。
(7)weightx和weighty:weightx屬性稱為水平重量,weightty屬性稱為垂直重量,
它們用來決定如何布置容器中多於的水平方向和垂直方向的空白地區。除非為一行
(weightx)和一列(weighty)中的至少一個組件指定了重量,否則,所有組件都會集中
在容器的中央,這是因為當重量為0(預設值)時,GridBagLayout把所有空白地區放在
組件的顯示地區和容器邊界之間。