在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();
	}

}

运行结果如下:

java使用布局管理器的好处 javaswing布局管理器_布局管理器

在本实例中,窗体的大小、位置以及窗体内组件的大小与位置都被进行绝对布局操作。绝对布局使用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对象
	}
}

运行结果如下:

java使用布局管理器的好处 javaswing布局管理器_java使用布局管理器的好处_02

本实例的结果可以看出,如果改变整个成窗体的大小,其中组件的位置也会相应的改变,正好验证了使用流布局管理器组件从左到右摆放,当组件填满一行后,自动换行,直到所有的组件都摆放在容器中为止。

边界布局管理器

在默认不指定窗体布局的情况下,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();
	}

}

运行结果为:

java使用布局管理器的好处 javaswing布局管理器_java_03

在本实例中,将布局以及组件名称分别设置在数组中,然后设置容器使用便捷布局管理器,最后在循环中将按钮添加到容器中,并设置组件布局。

网格布局管理器

网格布局管理器将容器划分为网格,所以组件可以按照行或者列进行排列。

在网格中,每个组件大小相同,并且网格中空格的个数由网格的行数和列数决定。

接下来看一个实际的例子:

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();
	}

}

运行结果如下:

java使用布局管理器的好处 javaswing布局管理器_Swing_04