JAVA的界面布局原理:因為Java是跨平台語言,使用絕對坐標顯然會導致問題,即在不同平台、不同分辨率下的顯示效果不一樣。Java 為了實現跨平台的特性並且獲得動態的布局效果,Java將容器內的所有組件安排給一個“布局管理器”負責管理,如:排列順序,組件的大小,位置等,當窗口移動或調整大小后組件如何變化等功能授權給對應的容器布局管理器來管理,不同的布局管理器使用不同算法和策略,容器可以通過選擇不同的布局管理器來決定布局。 Java中一共有6種布局管理器,通過使用6種布局管理器組合,能夠設計出復雜的界面,而且在不同操作系統平台上都能夠有一致的顯示界面。6種布局管理器分別是BorderLayout、BoxLayout、FlowLayout、GirdBagLayout、GirdLayout和 CardLayout。其中CardLayout必須和其他5種配合使用,不是特別常用的。每種界面管理器各司其職,都有各自的作用。
CardLayout(卡式布局)
CardLayout布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據整個容器的大小,但是每層只允許放置一個組件,當然每層都可以利用Panel來實現復雜的用戶界面.布局管理器(CardLayout)就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,每一張牌就相當於布局管理器中的每一層.其實現過程如下:
首先,定義面板,為個個面板設置不同的布局,並根據需要在每個面板中放置組件:
panelOne.setLayout(new FlowLayout);
panelTwo.setLayout(new GridLayout(2,1));
再設置主面板.
CardLayout card = new CardLayout();
panelMain.setLayout(card);
下一步將開始准備好的面板添加到主面板
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne);
add()方法帶有兩個參數,第一個為String類型用來表示面板標題,第二個為Panel對象名稱.
完成以上步驟以后,必須給用戶提供在卡片之間進行選擇的方法.一個常用的方法是每張卡片都包含一個按鈕.通常用來控制顯示哪張面板.actionListener被添加到按鈕..actionPerformed()方法可定義顯示哪張卡片.:
card.next(panelMain); //下一個
card.previous(panelMain); //前一個
card.first(panelMain); //第一個
card.last(panelMain); //最后一個
card.show(panelMain,"red panel"); //特定面板
BorderLayout布局管理器:BorderLayout 也是一種非常簡單的布局策略,它把容器內的空間簡單地划分為東、西、南、北、中無個區域,沒加入一個組件都應該指明把這個組件加在哪個區域中。 BorderLayout是頂層容器( JFrame, JDialog, 和 JApplet )的默認布局管理器。有五個位置組件:
這個界面最多只能顯示5個控件。加入控件的時候,可以指定加入的方位,默認的情況是加入到中間。在BorderLayout中整理尺寸是,四周的控件會被調整,調整會按照布局管理器的內部規則計算出應該占多少位置,然后中間的組件會占去剩下的空間。
BorderLayout 是Window,Frame和Dialog的缺省布局管理器. BorderLayout布局管理器把容器分成5個區域:North,South,East,West和Center,每個區域只能放置一個組件.在使用 BorderLayout的時候,如果容器的大小發生變化,其變化規律為:組件的相對位置不變,大小發生變化.例如容器變高了,則North、South 區域不變,West、Center、East區域變高;如果容器變寬了,West、East區域不變,North、Center、South區域變寬.不一定所有的區域都有組件,如果四周的區域(West、East、North、South區域)沒有組件,則由Center區域去補充,但是如果 Center區域沒有組件,則保持空白.
示例:
import java.awt.*;
public class buttonDir{
public static void main(String args[]){
Frame f = new Frame("BorderLayout");
f.setLayout(new BorderLayout());
f.add("North", new Button("North");
//第一個參數表示把按鈕添加到容器的North區域
f.add("South", new Button("South");
//第一個參數表示把按鈕添加到容器的South區域
f.add("East", new Button("East");
//第一個參數表示把按鈕添加到容器的East區域
f.add("West", new Button("West");
//第一個參數表示把按鈕添加到容器的West區域
f.add("Center", new Button("Center");
//第一個參數表示把按鈕添加到容器的Center區域
f.setSize(200,200);
f.setVisible(true);
}
}
FlowLayout布局管理器:流式布局管理器把容器看成一個行集,好象平時在一張紙上寫字一樣,一行寫滿就換下一行。行高是用一行中的控件高度決定的。FlowLayout是所有 JApplet/JApplet的默認布局。在生成流式布局時能夠指定顯示的對齊方式,默認情況下是居中(FlowLayout.CENTER)。在下面的示例中,可以用如下語句指定居左
JPanel panel= new JPanel(new FlowLayout(FlowLayout.LEFT)));
此為小應用程序(Applet)和面板(Panel)的缺省布局管理器,組件從左上角開始,按從左至右的方式排列.其構造函數為:
FlowLayout() //生成一個默認的流式布局,組件在容器里居中,每個組件之間留下5個像素的距離.
FlowLayout(int alinment) //可以設定每行組件的對齊方式.
FlowLayout(int alignment,int horz,int vert) //設定對齊方式並設定組件水平和垂直的距離.
當容器的大小發生變化時,用FlowLayout管理的組件會發生變化,其變化規律是:組件的大小不變,但是相對位置會發生變化.
GirdLayout布局管理器:GridLayout 將成員按網格型排列,每個成員盡可能地占據網格的空間,每個網格也同樣盡可能地占據空間,從而各個成員按一定的大小比例放置。如果你改變大小, GridLayout將相應地改變每個網格的大小,以使各個網格盡可能地大,占據Container容器全部的空間。
基本布局策略是把容器的空間划分成若干行乘若干列的網格區域,組件就位於這些划分出來的小區域中,所有的區域大小一樣。組件按從左到右,從上到下的方法加入。
用構造函數划分出網格的行數和列數,
new GridLayout(行數,列數);
構造函數里的行數和列數能夠有一個為零,但是不能都為零。當容器里增加控件時候,容器內將向0的那個方向增長。例如,如果是如下語句:
GridLayout layout= new GridLayout(0,1);
在增加控件時,會保持一個列的情況下,不斷把行數增長。
java.awt.GridBagConstraints 中的insets(0,0,0,0)的參數具體指的是:
規定一個控件顯示區的空白區。如果控件顯示的inset為(10,5,20,0)
那么控件到顯示區北邊距離為10,西邊為5,南邊為20,東邊為0控件會比顯示區小。如果inset為負,控件會超出顯示區
使容器中各個組件呈網格狀布局,平均占據容器的空間.當所有組件大小相同時,使用此布局.其構造函數為:
GridLayout()
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
BoxLayout布局管理器: BoxLayout布局能夠允許將控件按照X軸(從左到右)或者Y軸(從上到下)方向來擺放,而且沿着主軸能夠設置不同尺寸。
構造BoxLayout對象時,有兩個參數,例如:
Public BoxLayout(Container target,int axis);
Targe參數是表示當前管理的容器,axis是指哪個軸,有兩個值??BoxLayout.X_AXIS和BoxLayout.Y_AXIS。
看如下的代碼:
JPanel jpanel=new JPanel();
Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS);
TextArea testArea=new TextArea(4,20);
JButton button=new JButton(“this is a button”);
jpanel.add(testArea);
jpanel.add(button);
//容納testArea和button的容器,對他們沿Y軸(從上往下)放置,並且文本域和按紐左對齊。也就是兩個控件的最左端在同一條線上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容納testArea和button的容器,對他們采用沿Y軸(從上往下)放置,並且文本域最左端和按紐的最右端在同一條線上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.RIGHT_ALIGNMENT);
setAlignmentX(left,right)只有在布局是BoxLayout.Y_AXIS才效,而setAlignmentY(top,button)在布局為BoxLayout.X_AXIS才效果。
組件對齊一般來說:
所有top-to-bottom BoxLayout object 應該有相同的 X alignment。
所有left-to-right Boxlayout應該有相同的 Y alignment
setAlignmentX 和setAlignmentY 可以實現對齊。
GridBagLayout布局管理器:
這就是最復雜的一個布局管理器了,網格包布局.在此布局中,組件大小不必相同.
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
以上代碼是讓容器獲得一個GridBagLayout .
要使用網格包布局,還必須有其一個輔助類,GridBagContraints.它包含GridBagLayout類用來定位及調整組件大小所需要的全部信息.使用步驟如下:
1).創建網格包布局的一個實例,並將其定義為當前容器的布局管理器.
2).創建GridBagContraints的一個實例
3).為組件設置約束.
4).通過方法統治布局管理器有關組件及其約束等信息
5).將組件添加到容器.
6).對各個將被顯示的組件重復以上步驟..
GridBagContraints類的成員變量列表如下:
1).gridx,gridy
指定組件放在哪個單元中.其值應該設為常數CridBagConstraints.RELATIVE .然后按標准順序將組件加入網格包布局.從左到右,從上到下.
2).gridwidth,gridheight
指定組件將占用幾行幾列
3).weightx,weighty
指定在一個GridBagLayout中應如何分配空間.缺省為0.
4).ipadx,ipady
指定組件的最小寬度和高度.可確保組件不會過分收縮.
5).fill
指定在單元大於組件的情況下,組件如何填充此單元..缺省為組件大小不變.以下為靜態數據成員列表,它們是fill變量的值.
GridBagConstraints.NONE 不改變組件大小
GridBagConstraints.HORIZONTAL 增加組件寬度,使其水平填充顯示區域
GridBagConstraints.VERTICAL 增加組件高度,使其垂直填充顯示區域
GridBagConstraints.BOTH 使組件填充整個顯示區域
6).anchor
如果不打算填充可以通過anchor指定將組件放置在單元中的位置,缺省為將其放在單元的中部.可使用以下靜態成員:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.EAST
GridBagConstraints.WEST
GridBagConstraints.SOUTH
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.NORTHWEST
GridBagConstraints.SOUTHWEST
使用setConstraints()方法可以設置各組件約束.
GridBagLayout是是在GridLayout的基礎上發展起來的,是五種布局策略中使用最復雜,功能最強大的一種,它是在GridLayout的基礎上發展起來的。因為GridBagLayout中每個網格都相同大小並且強制組件與網格大小相同,使得容器中的每個組件也都是相同的大小,顯得很不自然,而且組件假如容器中必須按照固定的行列順序,不夠靈活。在GridBagLayout中,可以為每個組件指定其包含的網格個數,組件可以保留原來的大小,可以以任意順序隨意地加入容器的任意位置,從而實現真正自由地安排容器中每個組件的大小和位置。
通過創建一個gridBagConstraints實例為組件設置布局參數:
gridx, gridy
gridwidth, gridheight
fill
ipadx, ipady
insets
anchor
CENTER (the default), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, and NORTHWEST.
weightx, weighty
| 變量名 |
有效值 |
應用范圍 |
定義 |
| anchor |
CENTER EAST NORTH NORTHEAST SOUTH SOUTHWEST WEST |
組件 |
組件在網格中排放的位置 |
| fill |
BOTH HORIZONTAL VERTICAL NONE |
組件 |
組件填充網格的方式 |
| gridx,gridy |
RELATIVE 整數X,Y值 |
組件和顯示區 |
組件的左上角網格的位置 |
| gridheight gridwidth |
1 RELATIVE REMAINDER 寬,高度整數值 |
顯示區 |
網格單元中組件顯示區所占的高度和寬度 |
| Insets |
(0,0,0,0) |
組件和顯示區 |
外部填充 |
| ipadx,ipady |
0 |
組件和顯示區 |
內部填充 |
