外观
Swing布局
布局指容器中各个组件的排列方式,Swing中常用的布局有绝对布局、流布局、边界布局和网格布局。
绝对布局——null
若容器应用了绝对布局,则容器内每个组件都会按照它本身设定的位置和大小排列。使用方式是先调用窗体容器对象的setLayout(null)方法将窗体设为绝对布局,然后对每个组件调用setBounds()设定大小和位置。
package swing.Layouts;
import javax.swing.*;
import java.awt.*;
public class Null extends JFrame {
//容器布局之一 绝对布局
private Null() {
super("标题");
Container container = getContentPane();
container.setLayout(null); //设为绝对布局
JButton jButton1 = new JButton("按钮1");
jButton1.setBounds(20, 20, 100, 50);
JButton jButton2 = new JButton("按钮2");
jButton2.setBounds(100, 200, 150, 50);
container.add(jButton1);
container.add(jButton2);
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new Null();
}
}运行结果:

流布局——FlowLayout
流布局比较常用,效果有些像CSS里面的Flex布局。应用此布局后,组件会从左到右摆放,若该行溢出则将组件移动在下一行摆放,以此类推。使用此布局方式要使用窗体容器对象的setLayout(flowLayout)方法,其中flowLayout是FlowLayout类的一个对象。
FlowLayout类的构造方法如下:
public FlowLayout()。public FlowLayout(int align)。public FlowLayout(int align, int hgap, int vgap)。
参数align代表当某行的元素数量不足最大元素数量时,元素的排列方向,可选值有FlowLayout.LEFT,代表每一行的组件指定为左对齐;还有FlowLayout.CENTER和FlowLayout.RIGHT。
参数hgap指定水平间隔,vgap指定垂直间隔,单位都是像素。
示例代码:
package swing.Layouts;
import javax.swing.*;
import java.awt.*;
public class DemoFlowLayout extends JFrame {
private DemoFlowLayout() {
super("标题");
Container container = getContentPane();
//参数1为对齐方式 参数2为水平间距 参数3为垂直间距
container.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); //设为绝对布局
for (int i = 1; i < 20; i++) {
container.add(new JButton("按钮" + i));
}
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
//容器布局之一 流布局
public static void main(String[] args) {
new DemoFlowLayout();
}
}运行结果如下。当改变窗口的大小时元素的排列方式也会改变。


边界布局——BorderLayout
边界布局类似于Web页面的圣杯式布局,它将整个页面分为东南西北中五个区域。
若窗体应用了边界布局,则在每次添加元素时需要指定元素所在的位置。
将窗体设置为边界布局的方式也是调用setLayout()方法,需要传入一个BorderLayout对象。
BorderLayout类的成员变量如下:
public static final String NORTH;
public static final String SOUTH;
public static final String EAST;
public static final String WEST;
public static final String CENTER。
它们的字面值就代表了它们的意义。在添加组件时,指定位置使用的就是它们。
public void add(Component comp, Object constraint)方法用于向容器中添加组件,并且可以指定组件的位置。
示例代码:
package swing.Layouts;
import javax.swing.*;
import java.awt.*;
public class DemoBorderLayout extends JFrame{
//容器布局之一 边界布局
//该布局分为东南西北中五个区域
private DemoBorderLayout(){
super("标题");
Container container = getContentPane();
container.setLayout(new BorderLayout());
JButton jButton1 = new JButton("东");
JButton jButton2 = new JButton("南");
JButton jButton3 = new JButton("西");
JButton jButton4 = new JButton("北");
JButton jButton5 = new JButton("中");
container.add(jButton1,BorderLayout.EAST);
container.add(jButton2,BorderLayout.SOUTH);
container.add(jButton3,BorderLayout.WEST);
container.add(jButton4,BorderLayout.NORTH);
container.add(jButton5,BorderLayout.CENTER);
//重复添加时会覆盖之前添加的组件
setBounds(100,100,300,300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoBorderLayout();
}
}
网格布局——GridLayout
网格布局很好理解,就是按照顺序将组件放到预先设定好的表格中。在设置网格布局时,需要的布局对象为GridLayout对象。该类的构造方法如下:
public GridLayout(int rows, int columns)。public GridLayout(int rows, int cols, int hgap, int vgap)。
rows指定行数,columns指定列数,hgap指定水平间隔,vgap指定垂直间隔。
示例代码:
package swing.Layouts;
import javax.swing.*;
import java.awt.*;
public class DemoGridLayout extends JFrame {
//容器布局之一 网格布局
private DemoGridLayout() {
super("标题");
Container container = getContentPane();
//参数1为行数 参数2为列数 参数3为水平间距 参数4为垂直间距
container.setLayout(new GridLayout(5, 5, 5, 5)); //设为网格布局
for (int i = 1; i <= 20; i++) {
container.add(new JButton("按钮" + i));
}
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoGridLayout();
}
}运行结果:
