组件在容器中的位置和尺寸是由布局管理器决定的。
Swing常用布局有四种:FlowLayout(流式布局管理器)、BorderLayout(边界布局管理器)、GridLayout(网格布局管理器)、GridBagLayout(网格包布局管理器)。
Swing容器在创建时都会使用一种默认的布局管理器,在程序中可以通过调用容器对象的setLayout()方法设置布局管理器,通过布局管理器自动进行组件的布局管理。
二、FlowLayoutFlowLayout属于流式布局管理器,是最简单的布局管理器。
容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,自动将组件放到下一行的开始位置, 这些组件可以左对齐、居中对齐(默认)和右对齐的方式排列。
常用方法及变量如下:
| 方法及常量 | 类型 | 功能描述 |
| public FlowLayout() | 构造方法 | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
| public FlowLayout(int align) | 构造方法 | 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 |
| public FlowLayout(int align,int hgap,int vgap) | 构造方法 | 指定组件的对齐方式和水平、垂直间距 |
| public static final int CENTER | 常量 | 居中对齐 |
| public static final int LEADING | 常量 | 与容器的开始端对齐方式一样 |
| public static final int LEFT | 常量 | 左对齐 |
| public static final int RIGHT | 常量 | 右对齐 |
参数hgap和参数vgap分别设定组件之间的水平和垂直间隙,可以填入一个任意数值。
使用示例:
import javax.swing.*;
import java.awt.*;
public class FlowLayout_CSDN {
public static void main(String[] args) {
JFrame frame = new JFrame("hello word");
//设置窗体中的布局管理器为FlowLayout,所有的组件居中对齐,水平和垂直间距为3
frame.setLayout(new FlowLayout(FlowLayout.CENTER,3,3));
JButton button = null;
for(int i = 0;i<9;i++){
button = new JButton("按钮"+i);
frame.add(button);
}
frame.setSize(280,250);
frame.setVisible(true);
}
}
运行结果:
FlowLayout布局管理器的特点就是可以将所有组件像流水一样一次进行排列,不需要用户明确的设定,但是在灵活性上相对差了点。如:将窗口拉伸变宽,但按钮大小和间距保持不变。
三、BorderLayoutBorderLayout(边界布局管理器)是一种较为复杂的布局方式,将窗体划分为五个区域。组件可以被放置在这五个区域中的任意一个区域中。
改变窗体大小时,NORTH和SOUTH区域高度不变,宽度调整,WEST和EAST区域宽度不变,高度调整。
向BorderLayout窗体中添加组件,需要调用add(Component comp,Object constraints)方法,
其中参数comp表示要添加的组件,参数constraints用于指定组件添加方式以及添加位置,可以使用5个常量:EAST、SOUTH、WEST、NORTH、CENTER。
常用方法及常量如下:
| 方法及常量 | 类型 | 共能描述 |
| public BorderLayout() | 构造方法 | 构造没有间距的布局器 |
| public BorderLayout(int align,int hgap,int vgap) | 构造方法 | 构造有水平和垂直间距的布局器 |
| public static final String EAST | 常量 | 将组件设置在东区域 |
| public static final String WEST | 常量 | 将组件设置在西区域 |
| public static final String SOUTH | 常量 | 将组件设置在南区域 |
| public static final String NORTH | 常量 | 将组件设置在北区域 |
| public static final String CENTER | 常量 | 将组件设置在中区域 |
使用示例:
import javax.swing.*;
import java.awt.*;
public class BorderLayout_CSDN extends JFrame{
public BorderLayout_CSDN(){
//设置为边界布局,组件间横向,纵向间距均为5像素
this.setLayout(new BorderLayout(5,5));
setFont(new Font("Helvetica",Font.PLAIN,14));//正常风格
getContentPane().add("South",new JButton(BorderLayout.SOUTH));//将按钮添加到窗体面板
getContentPane().add("North",new JButton(BorderLayout.NORTH));
getContentPane().add("East",new JButton(BorderLayout.EAST));
getContentPane().add("West",new JButton(BorderLayout.WEST));
getContentPane().add("Center",new JButton(BorderLayout.CENTER));
}
public static void main(String[] args) {
BorderLayout_CSDN f = new BorderLayout_CSDN();
f.setTitle("边界布局");
f.pack();//调整窗口大小,以适合其组件的大小和布局
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);//窗体居中显示
}
}
运行结果:
如果不指定添加到哪个区域,则默认添加到CENTER区域,并且只能放置一个组件,如果添加多个组件,后放入的组件会覆盖先放入的。
四、GridLayoutGridLayout布局管理器是以网格的形式管理容器中组件布局的。
使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。
与FlowLayout类似,但不同的是,GridLayout将自动占据网格的整个区域。
常用方法如下:
| 方法声明 | 功能描述 |
| GridLayout() | 默认只有一行,每个组件占一列 |
| GridLayout(int rows,int cols) | 指定容器的行数和列数 |
| GridLayout(int rows,int cols,int hgap,int vgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
参数rows代表行数,cols代表列数,hgap和vgap规定水平和垂直方向的间隙。
水平间隙指的是网格之间的水平距离,垂直间隙指的是网格之间的垂直距离。
使用示例:
import java.awt.*;
public class GridLayout_CSDN {
public static void main(String[] args) {
Frame f = new Frame("GridLayout");//创建窗体
f.setLayout(new GridLayout(3,3));//设置该窗体为3*3的网格
f.setSize(300,300);
f.setLocation(400,300);
for (int i = 1;i<=9;i++){
Button btn = new Button("btn"+i);
f.add(btn);
}
f.setVisible(true);
}
}
运行结果:
五、GridBagLayout
GridBagLayout是最灵活的、最复杂的布局管理器,与GridLayout布局管理器类似,不同的是,GridBagLayout允许网格中的组件大小各不相同,而且允许一个组件跨越一个或多个网格。
使用步骤如下:1、创建GridBagLayout布局管理器,设置采用该管理器
例:
GridBagLayout layout = new GridBagLayout();
container.setLayout(layout);
2、创建GridBagContraints对象,并设置该对象的相关属性。
例:
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 1; //设置网格的左上角横向索引
constraints.gridy = 1; //设置网格的左上角纵向索引
constraints.gridwidth = 1; //设置组件横向跨越的网格
constraints.gridheight = 1; //设置组件纵向跨越的网格
3、调用GridBagLayout对象的setConstraints()方法,建立GridBagConstraints对象和受控组件之间的关联。
例:
layout.setConstraints(component,constraints);
4、向容器中添加组件
例:
container.add(component);
使用GridBagLayout布局管理器的关键在于GridBagConstraints对象,是每个组件布局的核心类,GridBagConstraints类中有很多用于设置约束条件的属性。
常用属性如下:
| 属性 | 作用 |
| gridx和gridy | 设置组件所在网格的横向和纵向索引(即所在的行和列)。如果将gridx和 gridy的值设置为GridBagConstraints.RELATIVE(默认值),表示当前组件紧跟在上一个组件后面。 |
| gridwidth和gridheight | 设置组件横向、纵向跨越几个网格,两个属性的默认值都是1。如果把这两个属性的值设为GridBagConstraints.REMAINER表示组件在当前行或列上为最后一个组件。如果把这两个属性的值设为GridBagConstraints.RELATIVE,表示组件在当前行或列上为倒数第二个组件。 |
| fill | 如果组件的显示区域大于组件需要的大小,设置组件改变方式,该属性接收以下几个属性值: l NONE :默认,不改变组件大小。 l HORIZONTAL :使组件水平方向足够长以填充显示区域,但是高度不变, l VERTICAL :使组件垂直方向足够高以填充显示区域,但长度不变。 l BOTH :使组件足够大,以填充整个显示区域。 |
| weightx和weighty | 设置组件占领容器中水平方向和垂直方向多余空白的比例(也称为权重)。假设容器的水平方向放置三个组件,组件的weightx属性值分别为1、2、3,当容器宽度增加60个像素时,这三个容器分别增加10、20、和30的像素。weightx和weighty属性的默认值是0,即不占领多余的空间。 |
注意:如果希望组件的大小随容器的增大而增大,必须同时设置GridBagConstraints对象的fill属性和weightx、weighty属性。
使用示例:
import java.awt.*;
class Layout extends Frame{
public Layout(String title){
GridBagLayout layout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(layout);
c.fill = GridBagConstraints.BOTH;//设置组件横向纵向可以拉伸
c.weightx = 1;//设置横向权重为1
c.weighty = 1;//设置纵向权重为1
this.addComponent("btn1",layout,c);
this.addComponent("btn2",layout,c);
this.addComponent("btn3",layout,c);
c.gridwidth = GridBagConstraints.REMAINDER;
this.addComponent("btn4",layout,c);
c.weightx = 0;
c.weighty = 0;
this.addComponent("btn5",layout,c);
c.gridwidth = 1;//设置组件跨一个网格
this.addComponent("btn6",layout,c);
c.gridwidth = GridBagConstraints.REMAINDER;
this.addComponent("btn7",layout,c);
c.gridheight = 2;//纵向跨两个网格
c.gridwidth = 1;
c.weightx = 2;
c.weighty = 2;
this.addComponent("btn8",layout,c);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 1;
this.addComponent("btn9",layout,c);
this.addComponent("btn10",layout,c);
this.setTitle(title);
this.pack();
this.setVisible(true);
}
//增加组件中的方法
private void addComponent(String name,GridBagLayout layout,GridBagConstraints c){
Button bt = new Button(name);
layout.setConstraints(bt,c);
this.add(bt);
}
}
public class GridBagLayout_CSDN{
public static void main(String[] args) {
new Layout("GridBagLayout");
}
}
运行结果:
btn1-4和btn8-10都将权重设置为大于0,拉伸窗口会随着增大,
btn5-7将权重设置为0,高度在拉伸不会变化,但长度会变化。



