佈局的概念:
佈局是指組件在容器中的排列方式,主要有:
1.流式佈局FlowLayout
以行爲單位依此排列各組件,一行排不下時另起一行
JPanel的默認佈局
該佈局適用於組件個數較少的情況。
缺點:當用戶對由FlowLayout佈局管理的區域進行縮放時,佈局會發生變化
構造方法:
- FlowLayout();
- FlowLayout(int align); //align一般取值有:CENTER、LEFT、RIGHT
- FlowLayout(int alig,int hgap,int vgap); //hgap和vgap指定組件與容器起始邊界以及組件間的水平和垂直間距,默認值爲5個像素
例如:FlowLayout layout = new FlowLayout(FlowLayout.LEFT,10,10);
FlowLayout佈局的使用:
創建FlowLayout佈局對象:
- FlowLayout fl = new FlowLayout();
創建容器對象:
- JPanel panel = new JPanel();
設置容器對象的佈局或使用默認佈局:
- panel.setLayout(fl);
向容器中添加組件對象(設組件對象已創建):
- panel.add(組件對象);
2.邊界佈局BorderLayout
按照東、西、南、北、中5個方位排列各組件
頂層容器JFrame、JApplet、JDialog、JWindow的默認佈局
缺點:當加入的組件超過5個時,就必須使用容器的嵌套或其它佈局
優點:當容器縮放時,組件相應的位置不變化,但大小改變
構造方法:
- BorderLayout();
- BorderLayout(int hgap,int vgap); //hgap和vgap指定組件間的水平和垂直間距,默認值爲0個像素
BorderLayout佈局的使用
創建BorderLayout佈局對象:
- BorderLayout bl = new BorderLayout();
創建容器對象:
- JPanel panel = new JPanel();
設置容器對象的佈局或使用默認佈局:
- panel.setLayout(bl);
向容器中添加組件對象(設組件對象已創建):
- panel.add(組件對象,方位);
//方位的取值爲:
BorderLayout.EAST 或“East”
BorderLayout.WEST 或“West”
BorderLayout.SOUTH 或“South”
BorderLayout.NORTH 或“North”
BorderLayout.CENTER 或“Center”(默認)
代碼:
import javax.swing.*;
import java.awt.*;
public class BorderDemo extends JFrame{
JButton bn,bs,bw,be,bc;
public BorderDemo(){
super("BorderLayout Demo");
Container c=getContentPane();
c.setLayout(new BorderLayout());
bn=new JButton("北");
bs=new JButton("南");
be=new JButton("東");
bw=new JButton("西");
bc=new JButton("中");
c.add("North",bn);
c.add(bs,"South");
c.add(BorderLayout.EAST,be);
c.add(bw,BorderLayout.WEST);
c.add("Center",bc);
setSize(400,400);
setVisible(true);
}
public static void main(String args[]){
new BorderDemo();
}
}
3.網格佈局GridLayout
按照二維網格以相同大小依此排列各組件
該佈局適用於組件個數較多的情況
優點:組件的相應位置不隨區域的縮放而改變,只是組件的大小改變。
構造方法:
- GridLayout(); //一行、每個組件一列
- GridLayout(int rows,int cols); //行列數
- GridLayout(rows,cols,int hgap,int vgap); //行行、列列的間距,默認值爲0個像素 佈局的使用
創建GridLayout佈局對象:
- GridLayout gl = new GridLayout(2,2);
創建容器對象:
- JPanel panel = new JPanel();
設置容器對象的佈局或使用默認佈局:
- panel.setLayout(gl);
向容器中添加組件對象(設組件對象已創建)
- panel.add(組件對象);
4.卡片佈局CardLayout
以一疊卡片的形式依此排列個組件
構造方法:
- CardLayout();
- CardLayout(int hgap,int vgap); //組件與容器間距,默認值爲0個像素
- 創建CardLayout cl = new CardLayout();
創建容器對象:
- JPanel panel = new JPanel();
設置容器對象的佈局或使用默認佈局:
- panel.setLayout(cl);
向容器中添加組件對象(設組件對象已創建):
- panel.add(組件對象,“名稱”);
顯示組件:
- cl.show(panel,“名稱”);
- cl.first(panel);
- cl.last(panel);
- cl.next(panel);
- cl.previous(panel);
代碼:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CardDemo extends JFrame implements ActionListener{
CardLayout card=new CardLayout();
Container c=getContentPane();
public CardDemo(){
super("CardLayout Demo");
JButton cb[]=new JButton[6];
c.setLayout(card);
for(int i=1;i<=5;i++){
cb[i]=new JButton("卡片號爲:"+i);
cb[i].addActionListener(this);
c.add(String.valueOf(i),cb[i]); //String.valueOf(i),該方法返回一個int參數的字符串表示形式
}
card.show(c,String.valueOf(4));
setSize(400,400);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
card.next(c);
}
public static void main(String args[]){
new CardDemo();
}
}
5.盒式佈局BoxLayout
以一行或一列的方式依此排列各組件
容器Box的默認佈局爲且只能爲BoxLayout
javax.swing.Box 類的使用
創建Box對象:
- Box b1 = Box.createHorizontalBox();
創建一個從左到右顯示其組件的Box
- Box b2 = Box.createVerticalBox();
創建一個從上到下顯示其組件的Box
向盒子中添加組件對象(設已創建):
- b1.add(組件對象);
向盒子中添加必要的透明組件
添加Glue:Glue用來對組件進行擠壓,產生左對齊、右對齊或兩端對齊的效果
- b1.add(Box.createHorizontalGlue());
- b2.add(Box.createVerticalGlue());
添加Strut:Strut用來加入組件間的間距
- b1.add(Box.createHorizontalStruct(5));
- b2.add(Box.createVerticalStruct(5));
添加RigidArea:RigidArea用來設置組件的間距和高度(寬度和間距)
- Dimension d = new Dimension(50,80);
- b1.add(Box.createRigidArea(d));
- b2.add(Box.createRigidArea(d));
6.網格包佈局GridBagLayout
從網格出發來佈局組件,但一個組件在橫向和縱向上都可以佔據多個網格,靈活但比較複雜
使用GridBagConstraints指定組件在佈局時的有關約束值
屬性(11個):
- gridx,gridy - 位置
- gridwidth,gridheight - 佔據網格數
- anchor - 方位
- fill - 充滿方式
javax.awt.GridBagConstraints.HORIZONTAL
javax.awt.GridBagConstraints.VERTICAL
javax.awt.GridBagConstraints.BOTH
創建對象:
- GridBagConstraints gbc1,gbc2;
- gbc1 = new GridBagConstraints();
- gbc2 = new GridBagConstraints(,);
佈局的使用
- GridBagLayout gbl = new GridBagLayout();
- JPanel panel = new JPanel();
- panel.setLayout(gbl);
- GridBagConstraints gbc = new GridBagConstraints();
,//設置 - Jbutton button = new JButton(“Button”);
- panel.add(button,gbc);
一般佈局步驟:
- 畫出組件佈局草圖
- 確定每個組件應占據的網格
- 分別在x和y方向上爲網格標上序號
- 組件的gridx,gridy,gridwidth,gridheight據填充和對齊要求設置fill和anchor值
- 須保持默認大小的組件的weightx和weighty值設爲0,其餘的設爲100
- 看是否需要設置填塞值insert和ipadx、ipady
- 編寫代碼,運行程序,觀察結果,必要時進行修改
7.空佈局(不使用佈局)null
不使用任何佈局管理器,一般不使用該方式
創建容器對象:
- JPanel panel = new JPanel();
設置容器對象的佈局爲null:
- panel.setLayout(null);
設置組件在容器中的位置:
- 組件對象.setBounds(x,y,width,height);
向容器中添加組件對象(設已創建):
- panel.add(組件對象);
注意:對於一些複雜的情況,往往需要使用容器的嵌套,各容器可使用不同的佈局。當容器的尺寸改變時,佈局管理器會自動調整組件的排列
代碼:
import java.awt.*;
import javax.swing.*;
public class NullLayout extends JFrame{
JButton b1=new JButton("按鈕1");
JButton b2=new JButton("按鈕2");
JButton b3=new JButton("按鈕3");
JLabel lb=new JLabel("看我們的擺放位置,很隨意!!");
public NullLayout(){
super("nullLayout Demo");
Container c=getContentPane();
c.setLayout(null);
c.add(lb);
lb.setBounds(300,190,200,30);
c.add(b1);
b1.setBounds(20,30,90,30);
c.add(b2);
b2.setBounds(100,70,90,30);
c.add(b3);
b3.setBounds(150,120,90,50);
setSize(540,480);
setVisible(true);
}
public static void main(String args[]){
new NullLayout();
}
}