JAVA的GUI(圖形用戶界面)由各種組件構成,主要分為AWT組件(java.awt)以及功能更強的Swing組件(javax.swing)兩種。
組件可以分為容器組件和非容器組件。容器組件是指可以包含其他組件的組件,又分為頂層容器和一般用途容器。非容器組件則必須包含在容器中。
組件的布局,包含各組件的位置和大小,通常由布局管理器負責。每個容器,都有一個默認的布局管理器,可以通過容器的setLayout()方法改變容器的布局管理器。
接下來介紹一下Java提供的幾個常用的布局管理器。
1.FlowLayout
定義在java.awt包中。布局方式為:將組件逐個放置在容器中的一行上,一行放滿就另起一個新行。
構造方式有3種:
FlowLayout():默認,居中對齊,水平和垂直間距是5個像素。
FlowLayout(int align):align指定對齊方式,水平和垂直間距是5個像素。align的可取的值有FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER。
FlowLayout(int align,int hgap,int vgap):align指定對齊方式,hgap指定水平間距,vgap指定垂直間距。
與其他布局管理器不同的是,FlowLayout不強行設定組件的大小,允許組件擁有自定義的尺寸。每個組件都有getPreferredSize()方法,容器的布局管理器會調用這一方法取得每個組件自定義的大小。
2.BorderLayout
定義在java.awt包中。是頂層容器(JFrame、JApplet、JDialog、JWindow)中內容窗格(Container contentPane,內容窗格獲取方法getContentPane())的默認布局管理器。
提供了一種較為復雜的組件布局管理:將容器划分為5個區域,東(BorderLayout.NORTH)南(BorderLayout.SOUTH)西(BorderLayout.WEST)北(BorderLayout.EAST)中(BorderLayout.CENTER),每個區域可添加一組件。
構造方式有2種:
BorderLayout():默認,組件之間沒有間距。
BorderLayout(int hgap,int vgap):指定水平間距(hgap),垂直間距(vgap)。
組件的添加:
組件必須通過add()方法加入到容器中的指定區域。默認放置在Center區域。
如果希望在某個區域顯示多個組件,可以先在該區域放置一個內部容器,比如JPanel組件,然后將所需的多個組件放到JPanel中,再將其放到指定的區域。通過內部容器的嵌套可以構造復雜的布局。
3.GridLayout
定義在java.awt包中。布局為網格式,將容器划分成若干行乘若干列的網格,組件依次放入其中,每個組件占據一格。
構造方式有3種:
GridLayout():只有一行的網格,網格的列數根據實際需要變化。
GridLayout(int rows,int cols):指定行數(rows),列數(cols)。
GridLayout(int rows,int cols,int hgap, int vgap):指定行數(rows),列數(cols),指定水平間距(hgap),垂直間距(vgap)。
rows,cols可以為0(大小根據實際需要變動),但是不可同時為0。網格每列的寬度都是相同的,網格每行的高度也是相同的。組件被放入容器的次序決定位置,從左至右依次填充,一行用完后轉入下一行。留白可以添加一個空白標簽。
網格個數與組件個數的關系:多添少補(空白標簽)。
容器大小改變,組件相對位置不變,大小隨之改變。
4.CardLayout
定義在java.awt包中。布局為卡片式,將容器處理為一系列的卡片,每一時刻只顯示其中的一張,容器充當卡片的容器。
顯示規則為先進先顯示。卡片的順序由組件對象本身在容器內部的順序決定。
構造方式有2種:
CardLayout():默認,無間距。
CardLayout(int hgap,int vgap):指定水平間距(hgap),指定垂直間距(vgap)。
常用方法:
add():容器添加組件。
public void first(Container parent):翻轉到容器的第一張。
public void next(Container parent):翻轉到容器的下一張。到底則翻首張。
public void previous(Container parent):翻轉到容器的前一張。到頭則翻末張。
public void last(Container parent):翻轉到容器的最后一張。
public void show(Container parent, String name):翻轉已添加的指定name卡片。不存在則沒有反應。
5.BoxLayout
定義在javax.swing包中。布局方式為:將組件按水平方向排成一行,或者按垂直方向排成一列。
排成一行每個組件可以有不同的寬度;排成一列每個組件可以有不同的高度。
構造方法只有1種:
BoxLayout(Container target,int axis):容器對象參數target指定要應用布局的容器,axis設置按水平方向排列(BoxLayout.X_AXIS)或按垂直方向排列(BoxLayout.Y_AXIS)。
在javax.swing包中定義了專門使用BoxLayout的容器——Box類。
創建Box靜態方法:
public static BoxcreateHorizontalBox():水平方向的BoxLayout。
public static BoxcreateVertitcalBox():垂直方向的BoxLayout。
創建Box不可見組件的方法:
作用是可以增加課件組件之間的距離。
public static Componet createHorizonalGlue()。
public static Componet createVerticalGlue()。
public static Componet createHorizonalStrut(int width)。
public static Componet createVerticalStrut(int height)。
public static Componet createRigidArea(Dimension d)。
6.空布局
特殊場合可以不適用布局管理器。
調用容器的setLayout(null)將布局管理器設置為空,然后調用組件的setBounds(int x, int y, int width, int height)設置組件大小位置。