Java GUI 布局管理器


容器可設置布局管理器,管理容器中組件的布局:

container.setLayout(new XxxLayout());

 

Java有6種布局管理器,AWT提供了5種:

  • FlowLayout
  • BorderLayout
  • GridLayout
  • GridBagLayout
  • CradLayout

Swing還提供了一種:

  • BoxLayout

 

 

 

1、FlowLayout     流式布局

顧名思義,組件像水流一樣,從第一行開始,從左向右依次排列,碰到邊界時轉到下一行繼續。

三個構造函數:

  • FlowLayout()     //使用默認參數
  • FlowLayout(int align)   //設置對齊方式
  • FlowLayout(int align,int hgap,int vgap)   //設置對齊方式、水平間距、垂直間距

align是FlowLayout類的常量,比如:FlowLayout.LEFT,FlowLayout.CENTER

 

 

 

2、BorderLayout   邊界布局

將容器划分為EAST、WEST、SOUTH、NORTH、CENTER五個部分,每個部分可放置一個組件。

2個構造函數:

  • BorderLayout()  //使用默認參數
  • BorderLayout(int hgap,int vgap)   //設置水平間距、垂直間距

放置組件時需指定位置:

  • container.add(Component  comp, Borderlayout.SOUTH);    //第二個參數是BorderLayout類的常量,指定組件位置
  • container.add(Component comp);   //缺省位置時,默認為BorderLayout.CENTER,放在中間

一共5個位置,一個位置最多放1個組件。

當然,可以在一個位置放置多個組件,只是后放置的組件會覆蓋之前放置的組件。也可以一個都不放。

 

 

 

3、GridLayout   網格布局

將容器划分為指定行數、列數的網格,每個格子的尺寸都相同,一個格子中放置一個組件,適合組件大小差不多的,比如放置計算器的按鈕。

從左往右、從上往下依次放置。

注意,網格線實際是不顯示的。

2個構造函數:

  • BorderLayout(int rows,int cols)   //設置行數、列數
  • BorderLayout(int rows,int cols,int  hgap,int vgap)    //設置行數、列數、水平間距、垂直間距

 

 

 

4、GridBagLayout   網格包布局

在GridLayout基礎上發展而來,比GridLayout更加靈活。功能最強大,但也是最復雜的。

使用步驟:

(1)創建並指定布局管理器

  GridLayout  layout=new GridLayout();

  container.setLayout(layout);

(2)創建GridBagConstraints對象並設置屬性

  GridBagConstraints  constraints=new GridBagConstraints();

  constraints.gridx=2;   //設置該組件的起始位置的x坐標

  constraints.gridy=1;  //設置該組件的起始位置的y坐標

  constraints.gridwidth=2;  //設置該組件水平占據幾個網格

  constraints.gridheight=1;   //設置改組件豎直方向占據幾個網格

(3)建立布局管理器、組件、GridBagConstraints對象中間的關聯

  layout.setConstraints(component, constraints);     //第一個參數是組件,第二個是GridBagConstraints對象

  GridBagLayout用一個GridBagConstraints對象設置一個組件的位置

(4)向容器中添加組件

  container.add(component);

 

添加組件時,重復(2)、(3)、(4)步。

GridBagConstraints有很多屬性,比如fill——如何填充網格,此處不再一一列舉。

 

 

 

 

5、CardLayout   卡片布局

將容器中的所有組件(通常是容器)當做一疊卡片,只顯示一張卡片(一個組件)。

2個構造函數:

  • CradLayout()
  • CardLayout(int hgap,int vgap)   //設置卡片與容器(左右、上下)邊界的的距離

使用步驟:

(1)創建並指定布局管理器

  CardLayout  layout=new CardLayout(10,10);

  container.setLayout(layout);

(2)往容器中添加卡片

  container.add("第一張",component1);   //第一個參數是卡片名,String類型,唯一標識此張卡片,第二個參數是要添加的組件(卡片)

  container.add("第二張",component2);

  .......

默認顯示第一張卡片(最先添加的那張)。

一般是配合事件監聽使用,發生xx事件時顯示指定的卡片。

 

CardLayout對象可指定要顯示的卡片:

  • first(container)   //顯示第一張卡片(最先放入的那張)。參數container是卡片所在的容器
  • last(container)    //最后一張
  • previous(container)    //前一張
  • next(container)   //下一張
  • show(container,"卡片名")   //特定的那張。第二個參數是添加卡片時指定的卡片名,唯一標識一張卡片

卡片是有順序的,按照添加的順序排列,最先添加的是第一張卡片。

 

以上幾個方法是CardLayout對象具有的,使用示例:

CardLayout  layout=new CardLayout();

container.setLayout(layout);

.......

layout.show(container,"第二張");   //是通過布局管理器調用

 

 

 

 

6、BoxLayout  

BoxLayout是在一個方向上排列組件,從左往右水平排列,或者從上往下豎直排列。

構造函數:

  • BoxLayout(container, axis);   //第一個參數指定容器,第二個參數指定排列方向,

第二個參數可選的值是BoxLayout類的2個常量:BoxLayout.X_AXIS   水平排列,BoxLayout.Y_AXIS  豎直排列

 

BoxLayout的另一種使用方式:

Box  box=Box.createHorizontalBox();     //Box是一個容器,可使用靜態方法創建Box對象,自帶BoxLayout布局管理器。

  //createHorizontalBox()創建的Box對象默認使用水平的BoxLayout布局,createVerticalBox()默認使用豎直的BoxLayout布局。不必再指定布局管理器。

box.add(component);

 

 

 

如果不設置布局管理器:

  • JFrame、JDialog、JScrollPane默認使用BorderLayout
  • JPanel(包括Applet)默認使用FlowLayout

 

 

 

Java有2種方式管理布局:

  • 使用布局管理器
  • 絕對定位

 

絕對定位的使用示例:

container.setLayout(null);    //不使用布局管理器,清除默認的布局管理器

component1.setBounds(......);     //手動為每個組件設置位置、尺寸   

component2.setBounds(.....);  

container.add(component1);

container.add(component2);

絕對定位很靈活、很簡捷,可自由放置組件,但不跨平台。一般還是建議使用布局管理器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM