Java的圖形用戶界面——佈局管理(三)

佈局的概念:

佈局是指組件在容器中的排列方式,主要有:

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();
   	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章