窗體裡面有很多組件,這些組件對在窗體中的擺放位置和組件尺寸都有自身的要求,程式設計師添加這些組件到窗體時,該如何安排這些組件在窗體的位置和尺寸呢?這就需要用到Swing的布局管理器。下面主要介紹常用的布局管理器。
絕對布局
程式設計師需要設置每個組件在窗體的大小和位置,在實際編程中,較少採用這種布局管理。使用絕對布局,程式設計師可以採用下面的步驟:
(1)調用窗體的setLayout方法取消窗體的默認布局。調用方法如下:
窗體對象.setLayout(null);
(2)調用組件的setBounds方法,設置組件在窗體的位置和大小。調用方法如下:
組件對象. setBounds(x, y, w, h)
其中,x和y是組件在窗體的坐標,w是窗體的寬度,h是窗體的高度。
案例1:創建一個窗體,該窗體使用絕對布局,在窗體中添加兩個JLabel組件。
在項目PCoreUnit13下新建layout包,在layout包內新建JFreamAbsolutelyTest類。代碼如下:
packagelayout;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.WindowConstants;/*** @ClassName: JFreamAbsolutelyTest* @Description: Swing程序設計(常用布局管理器)案例1* @author 編程訓練營* @date**/publicclass JFreamAbsolutelyTest { /** * @Title: main * @Description:Java程序入口main方法 * @param@param args 參數 * @return void 返回類型 * @throws */publicstaticvoid main(String[] args) { // 實例化JFrame對象 JFrame frame = new JFrame("窗體絕對布局"); // 創建一個標籤組件 JLabel label1 = new JLabel("這是第一個組件"); JLabel label2 = new JLabel("這是第二個組件"); // 窗體設置為絕對布局 frame.setLayout(null); //設置窗體的大小 label1.setBounds(20, 100, 250, 100); label2.setBounds(300, 150, 250, 100); // 將label組件添加到容器 frame.add(label1); frame.add(label2); // 設置窗口的寬度和高度 frame.setSize(500,500); // 窗口居中 frame.setLocationRelativeTo(null); // 設置窗口可見 frame.setVisible(true); //設置窗口關閉方式,窗口關閉程序退出 frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); }}
程序執行結果如下圖所示:
流式布局
窗體按照組件加入的先後順序,遵循從左到右,從上到下的排列方式來安排組件在窗體的位置。具體安排方式:先從窗體的第一行從左到右開始安排組件,當第一行的組件位置已滿時,再從第二行開始安排,以此類推。
流式布局用FlowLayout類來定義,FlowLayout類有三個構造方法,具體說明如下:
public FlowLayout()
該構造方法使用默認方式創建流式布局,組件在窗體中使用居中對齊方式,組件之間的水平和垂直間距都為默認的5個單位。
public FlowLayout(int align)
該構造方法使用指定的對齊方式和默認的5單位水平和垂直間距創建流式布局。參數align可以是下列值之一:,FlowLayout.RIGHT, FlowLayout.CENTER,FlowLayout.LEADING,FlowLayout.TRAILING。
public FlowLayout(int align, int hgap, int vgap)
該構造方法使用指定的對齊方式和指定的水平和垂直間距創建流布局。參數hgap和vgap分別指定水平間距和垂直間距。
案例2:創建一個窗體,該窗體使用流式布局,在窗體中添加多個JLabel組件。
在layout包內新建JFreamFlowLayoutTest類。代碼如下:
importjava.awt.FlowLayout;* @ClassName: JFreamFlowLayoutTest* @Description: Swing程序設計(常用布局管理器)案例2publicclass JFreamFlowLayoutTest { JFrame frame = new JFrame("窗體流式布局");// 設置窗體為流式布局 frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20)); // 使用循環添加JLabel組件for( int i = 1; i < 21; i++ ) { JLabel label = new JLabel("這是第" + i + "個組件"); frame.add(label); }
網格布局
將窗體按M行N列方式均勻分隔多個網格,每個網格只能存放一個組件。組件按照加入的先後順序,遵循從左到右,從上到下的排列方式被安置在每個網格中。
網格布局用GridLayout類來定義,GridLayout類有三個構造方法,具體說明如下:
public GridLayout()
該構造方法創建網格布局,默認為每一個組件在一行中有一列,即多行單列。
public GridLayout(int rows, int cols)
該構造方法創建具有指定行數和列數的網格布局。參數rows指定行數,參數cols指定列數。
public GridLayout(int rows, int cols, int hgap, int vgap)
該方法創建具有指定行數和列數的網格布局,並指定每個網格間的水平和垂直間距。參數hgap指定網格間的水平間距,參數vgap指定網格間的垂直間距。
案例3:創建一個窗體,該窗體使用網格布局,在窗體中添加多個JLabel組件。
在layout包內新建JFreamGridLayoutTest類。代碼如下:
importjava.awt.GridLayout;* @ClassName: JFreamGridLayoutTest* @Description: Swing程序設計(常用布局管理器)案例3* @datepublicclass JFreamGridLayoutTest { * @param@param args 參數 * * @return void 返回類型 @throws JFrame frame = new JFrame("窗體網格布局"); // 設置窗體為3行2列的網格布局 frame.setLayout(new GridLayout(3,2));for (int i = 1; i < 7; i++) { JLabel label = new JLabel(" 這是第" + i + "個組件");
邊界布局
在邊界布局中,窗體空間被分為五個區域:CENTER、EAST、WEST、NORTH、SOUTH。依次對應為:北(NORTH)、南(SOUTH)、西(WEST)、東(EAST),中(CENTER)。邊界布局是窗體默認的布局。
開發者可以把組件放在窗體這五個位置中的任意一個,如果未指定位置,則預設的位置是CENTER。
邊界布局由BorderLayout類定義,BorderLayout類常用的構造方法說明如下:
public BorderLayout()
該構造方法創建一個邊界布局,組件之間沒有間距。
public BorderLayout(int hgap, int vgap)
該構造方法使用組件之間指定的間距創建一個邊界布局。
窗體調用add方法添加組件時,可以設置待添加的組件在邊界布局中的五個區域之一,這五個區域可以由下列值表示:
BorderLayout. NORTH
窗體添加組件時,將組件置於窗體的頂端(北區域)。
BorderLayout. SOUTH
窗體添加組件時,將組件置於窗體的底端(南區域)。
BorderLayout. EAST
窗體添加組件時,將組件置於窗體的右端(東區域)。
BorderLayout. WEST
窗體添加組件時,將組件置於窗體的左端(西區域)。
BorderLayout. CENTER
窗體添加組件時,將組件置於窗體的中間(中區域)。
案例4:創建一個窗體,該窗體使用邊界布局,在窗體中添加多個JLabel組件。
在layout包內新建JFreamBorderLayoutTest類。代碼如下:
importjava.awt.BorderLayout;
importjavax.swing.SwingConstants;* @ClassName: JFreamBorderLayoutTest* @Description: Swing程序設計(常用布局管理器)案例4publicclass JFreamBorderLayoutTest { JFrame frame = new JFrame("窗體邊界布局"); // 設置窗體邊界布局 frame.setLayout(new BorderLayout(30,30)); // 添加JLabel組件到窗體頂端 JLabel label1 = new JLabel("這個組件在頂端"); label1.setHorizontalAlignment(SwingConstants.CENTER); frame.add(BorderLayout.NORTH,label1); // 添加JLabel組件到窗體左端 JLabel label2 = new JLabel("這個組件在左端"); label2.setHorizontalAlignment(SwingConstants.CENTER); frame.add(BorderLayout.WEST,label2); // 添加JLabel組件到窗體右端 JLabel label3 = new JLabel("這個組件在右端"); label3.setHorizontalAlignment(SwingConstants.CENTER); frame.add(BorderLayout.EAST,label3); // 添加JLabel組件到窗體中間 JLabel label4 = new JLabel("這個組件在中間"); label4.setHorizontalAlignment(SwingConstants.CENTER); frame.add(BorderLayout.CENTER,label4); JLabel label5 = new JLabel("這個組件在底端"); label5.setHorizontalAlignment(SwingConstants.CENTER); frame.add(BorderLayout.SOUTH,label5);