在Swing中,每个组件在容器中都有一个具体的位置和大小,而在容器中摆放各种组件很难判断其位置和大小。布局管理器提供了Swing组件安排、展示在容器中的方法及基本的布局功能。
使用布局管理器与直接在容器中控制Swing组件的位置和大小方便的多,可以有效的管理整个布局。Swing提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器。
绝对布局
在Swing中,除了使用布局管理器之外还可以使用绝对布局。
绝对布局,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
使用绝对布局的步骤如下:
-
使用Container.setLayout(null) 方法取消布局管理器。
-
使用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();
}
}
运行结果如下: