说明: Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。
分类:
今天主要讲解的是边界布局管理器、流式布局管理器和网格布局管理器。
BorderLayout:边界布局管理器
说明:
BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)。
组件可以被放置在这五个区域中的任意一个位置。
官方布局效果图:
使用:
向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法。
参数comp表示要添加的组件,constraints指定将组件添加到布局中的位置,它是一个Object类型。
传参时可以使用BorderLayout类提供的5个常量设置组件位置,它们分别是PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER。
说明:
BorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。
向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域。
每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。
package First;
import java.awt.*;
import javax.swing.*;
public class _1_边界布局管理器 {
public static void main(String[] args) {
//创建并设置JFrame容器窗口
JFrame jf = new JFrame() ;//此时的窗口是不可见的,需要使用下面的方法进行设置可见
//设置位置(单位是像素)
jf.setLocation(200, 300);
//设置大小(单位是像素)
jf.setSize(400, 600);
//当窗口关闭的时候,eclipse并不会停止运行,这个时候怎么能够使窗口关闭的时候,eclipse也会停止运行。
//在关闭的时候退出
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的标题
jf.setTitle("我的第一个窗口");
//创建命令按钮
JButton btn = new JButton("ok") ;
JButton btn2 = new JButton("yes") ;
JButton btn3 = new JButton("center") ;
JButton btn4 = new JButton("left") ;
JButton btn5 = new JButton("right") ;
//添加组件(组件时不能够单独存在的,必须放在容器中)
// jf.add(btn);
// jf.add(btn2);
//上面的代码可以发现,上面的ok被代替了,变成了yes,这就与布局管理区有关系了
//随着窗口的改变,按钮的大小改变,但是相对位置不会发生改变
jf.add(btn, BorderLayout.PAGE_START);//后面点出来的参数可以改成 .NORTH 下同
jf.add(btn2 , BorderLayout.PAGE_END);//.SOUTH
jf.add(btn3 , BorderLayout.CENTER);//.CENTER
jf.add(btn4 , BorderLayout.LINE_START);//.WEST
// jf.add(btn5 , BorderLayout.LINE_END);//.EAST
jf.add(btn5 , "East");//这是一种新方法,直接写英文单词,首字母大写,其他字母小写
//设置可见
jf.setVisible(true);//true是可见的,false是不可见的
}
}
说明:
上面的两种传参的参数是可以的,不过也可以直接写出英文单词,不过需要首字母大写,其他字母小写(上面的举例中已经给出)。
FlowLayout:(流式布局管理器)
说明:
FlowLayout(流式布局管理器)是最简单的布局管理器。
在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。
这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。
构造方法:
说明:
参数align决定组件在每行中相对于容器边界的对齐方式,分别为左对齐、右对齐、居中对齐。
对齐方式可以使用该类中提供的常量FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER表示。
参数hgap和参数vgap分别设定组件之间的水平和垂直间距,可以填入一个任意数值。
package First;
import javax.swing.*;
import java.awt.*;
public class _2_流式与网格布局管理器 {
public static void main(String[] args) {
JFrame jf = new JFrame() ;//此时的窗口是不可见的,需要使用下面的方法进行设置可见
//设置位置(单位是像素)
jf.setLocation(200, 300);
//设置大小(单位是像素)
jf.setSize(400, 600);
//当窗口关闭的时候,eclipse并不会停止运行,这个时候怎么能够使窗口关闭的时候,eclipse也会停止运行。
//在关闭的时候退出
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的标题
jf.setTitle("我的第一个窗口");
//创建一个命令按钮
JButton btn = new JButton("ok") ;
JButton btn2 = new JButton("yes") ;
JButton btn3 = new JButton("center") ;
JButton btn4 = new JButton("left") ;
JButton btn5 = new JButton("right") ;
// 设置流式布局管理器(当窗口的大小发生改变的时候,按钮可以改变相对位置,但不会改变大小)
jf.setLayout(new FlowLayout());
jf.add(btn);
jf.add(btn2 );
jf.add(btn3 );
jf.add(btn4);
jf.add(btn5);
//设置可见
jf.setVisible(true);//true是可见的,false是不可见的
}
}
如果缩小窗口是什么样的效果?
将上面的代码设置对齐方式与水平垂直间距:
//左对齐,水平间距20px,垂直间距30px
jf.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
jf.add(btn);
jf.add(btn2);
jf.add(btn3);
jf.add(btn4);
jf.add(btn5);
当再次缩小窗口的时候得到的又是什么效果?
GridLayout(网格布局管理器):
说明:
GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件。
添加到容器中的组件会从左向右、从上向下依次填充到网格中。
与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域
构造方法:
说明:参数rows代表行数,cols代表列数,hgap和vgap规定窗格之间水平和垂直方向的间距。
package First;
import javax.swing.*;
import java.awt.*;
public class _2_流式与网格布局管理器 {
public static void main(String[] args) {
JFrame jf = new JFrame() ;//此时的窗口是不可见的,需要使用下面的方法进行设置可见
//设置位置(单位是像素)
jf.setLocation(200, 300);
//设置大小(单位是像素)
jf.setSize(400, 600);
//当窗口关闭的时候,eclipse并不会停止运行,这个时候怎么能够使窗口关闭的时候,eclipse也会停止运行。
//在关闭的时候退出
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的标题
jf.setTitle("我的窗口");
//创建一个命令按钮
JButton btn = new JButton("ok") ;
JButton btn2 = new JButton("yes") ;
JButton btn3 = new JButton("center") ;
JButton btn4 = new JButton("left") ;
JButton btn5 = new JButton("right") ;
//设置网格布局(当窗口的大小发生改变的时候,按钮可以改变大小,不会改变相对位置)
jf.setLayout(new GridLayout(2,3));//设置为两行三列,根据整个窗口的大写,平均分配每一个格子
jf.add(btn);
jf.add(btn2);
jf.add(btn3);
jf.add(btn4);
jf.add(btn5);
//设置可见
jf.setVisible(true);//true是可见的,false是不可见的
}
}
将上面的窗口缩小后又什么样的效果呢?
特点:
组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。
缺点:
总是忽略组件的最佳大小,所有组件的宽高都相同。
善意的说明:
边界布局管理器:随着窗口的改变,按钮的大小改变,但是相对位置不会发生改变
流式布局管理器:当窗口的大小发生改变的时候,按钮可以改变相对位置,但不会改变大小
网格布局管理器:当窗口的大小发生改变的时候,按钮可以改变大小,不会改变相对位置