1. 程式人生 > >常用佈局管理器

常用佈局管理器

在Swing中,每個元件在容器中都有一個具體的位置和大小,而在容器中擺放各種元件很難判斷其位置和大小。佈局管理器提供了Swing元件安排、展示在容器中的方法及基本的佈局功能。

使用佈局管理器與直接在容器中控制Swing元件的位置和大小方便的多,可以有效的管理整個佈局。Swing提供的常用佈局管理器包括流佈局管理器、邊界佈局管理器和網格佈局管理器。

絕對佈局

在Swing中,除了使用佈局管理器之外還可以使用絕對佈局。

絕對佈局,就是硬性指定元件在容器中的位置和大小,可以使用絕對座標的方式來指定元件的位置。

使用絕對佈局的步驟如下:

  1. 使用Container.setLayout(null) 方法取消佈局管理器。

  2. 使用Component.setBounds()方法設定每個元件的大小與位置

import java.awt.*;

import javax.swing.*;

public class AbsoulutePosition extends JFrame{

	public  AbsoulutePosition() {
		setTitle("本窗體使用絕對佈局");		//設定該窗體的標題
		setLayout(null);	//	使該窗體取消佈局管理器的設定
		setBounds(0,0,200,150);	//絕對定位窗體的位置與大小
		Container c = getContentPane();		//建立容器物件
		JButton jb1 = new JButton("按鈕1");	//建立按鈕1
		JButton jb2 = new JButton("按鈕2");	//建立按鈕2
		jb1.setBounds(10,30,80,30);		//設定按鈕1位置與大小
		jb2.setBounds(60,70,100,20);	//設定按鈕2位置與大小
		c.add(jb1);		//將按鈕1新增到容器中
		c.add(jb2);		//將按鈕2新增到容器中
		setVisible(true);	//設定容器可見性
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//設定容器關閉方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new AbsoulutePosition();
	}

}

執行結果如下:

在本例項中,窗體的大小、位置以及窗體內元件的大小與位置都被進行絕對佈局操作。絕對佈局使用setBounds(intx, int y, int width, int height)方法進行設定,如果使窗體物件呼叫setBounds()方法,它的x y 引數代表窗體在整個螢幕中的位置,width height代表窗體的寬與長。如果使窗體內的元件呼叫setBounds()方法,x,y引數代表;這個元件在整個窗體中的位置,width height代表元件的寬與長。

Note:

在使用絕對佈局之前,需要呼叫setLayout(null)方法告知編譯器,這裡不再使用佈局管理器。

流佈局管理器(FlowLayout)

流佈局管理器是最基本的佈局管理器,在整個容器中的佈局正如其名,像“流”一樣從左到右擺放元件,知道佔據了這一行的所有空間,然後再向下一行移動。預設情況下,元件在每一行都是居中排列的,但是通過設定也可以更改元件在每一行上的擺放位置。

import java.awt.*;

import javax.swing.*;

public class FlowLayoutPosition extends JFrame {
	public FlowLayoutPosition() {
		setTitle("本視窗使用流佈局管理器");	//設定窗體標題	
		Container c = getContentPane();		//建立容器
		//設定窗體使用流佈局管理器,是元件左對齊,並且設定元件之間的水平和垂直距離
		setLayout(new FlowLayout(1,10,10));		
		for(int i = 0; i<10; i++) {
			c.add(new JButton("button" + i));	//建立9個button
		}
		setSize(300,200);	//設定容器大小
		setVisible(true);	//設定容器可見
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//設定窗體關閉方式
		
	}
	public static void main(String[] args) {
		new FlowLayoutPosition();	//建立一個FlowLayoutPosition物件
	}
}

執行結果如下:

本例項的結果可以看出,如果改變整個成窗體的大小,其中元件的位置也會相應的改變,正好驗證了使用流佈局管理器元件從左到右擺放,當元件填滿一行後,自動換行,直到所有的元件都擺放在容器中為止。

邊界佈局管理器

在預設不指定窗體佈局的情況下,Swing元件的佈局模式是邊界(BorderLayout)佈局管理器。在之前的例子中,有出現在容器中只新增一個標籤元件,在執行結果中該元件被放置在窗體中間,並且整個元件佔據了窗體的所有空間,實質上容器中預設的使用了邊界佈局管理器。

但是邊界佈局管理器的功能不止如此,還可以將容器劃分為:東、南、西、北、中五個區域,可以將元件放入這五個區域當中。容器呼叫container.add()方法新增元件時候可以設定次元件在邊界佈局管理器當中的位置。區域控制可以使用BorderLayout類中的成員變數來決定。

下面看一個例子:

import java.awt.BorderLayout;
import java.awt.*;

import javax.swing.*;

public class BorderLayoutPosition extends JFrame {
	//定義元件擺放位置的陣列
	String[] border = {BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.SOUTH,
			BorderLayout.WEST,BorderLayout.EAST};
	//定義按鈕名稱
	String[] buttonName = {"center button","north button",
			"south button","west button","east button"};
	
	//自定義類BorderLayoutPosition的建構函式
	public BorderLayoutPosition() {
		setTitle("這個視窗使用的是邊界佈局管理器");	//設定標題
		Container container = getContentPane();		//定義一個容器
		setLayout(new BorderLayout());	//設定容器為邊界佈局管理器
		for(int i = 0; i< border.length; i++) {	//在迴圈中為容器新增按鈕,並設定按鈕佈局
			container.add(border[i], new JButton(buttonName[i]));
		}
		setSize(350,200);	//設定容器大小
		setVisible(true);	//設定容器可見
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//設定容器關閉方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new BorderLayoutPosition();
	}

}

執行結果為:

在本例項中,將佈局以及元件名稱分別設定在陣列中,然後設定容器使用便捷佈局管理器,最後在迴圈中將按鈕新增到容器中,並設定元件佈局。

網格佈局管理器

網格佈局管理器將容器劃分為網格,所以元件可以按照行或者列進行排列。

在網格中,每個元件大小相同,並且網格中空格的個數由網格的行數和列數決定。

接下來看一個實際的例子:

import java.awt.*;

import javax.swing.*;

public class GridLayoutPosition extends JFrame {

	public GridLayoutPosition() {
		setTitle("這個視窗使用過網格佈局管理器");
		Container container = getContentPane();
		setLayout(new GridLayout(7,3,5,5));	//設定容器使用網格佈局,並且設定為7行3列的網格
		for(int i  = 0; i<=20; i++) {	//在容器中新增按鈕
			container.add(new JButton("button" + i));
		}
		setSize(400,400);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GridLayoutPosition();
	}

}

執行結果如下: