容器可設置佈局管理器,管理容器中組件的佈局: container.setLayout(new XxxLayout()); Java有6種佈局管理器,AWT提供了5種: FlowLayout BorderLayout GridLayout GridBagLayout CradLayout Swing還 ...
容器可設置佈局管理器,管理容器中組件的佈局:
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);
絕對定位很靈活、很簡捷,可自由放置組件,但不跨平臺。一般還是建議使用佈局管理器。