目录
如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件 的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发 生改变。那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如: 可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种“布 局”,要管理这些布局,就需要布局管理器。
管理布局的类由 java.awt 包来ᨀ供,布局管理器是一组实现 java.awt.LayoutManager 接 口的类,由这些类自动定位组件。一般使用布局管理器定义容器,如果容器使用了某种布局 管理器后,那么放在其上的控件就按照相应的规则排列。我们接下来就介绍几种常用的布局 管理器:流式布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)。
如果在一个容器中压入控件(该示例的控件用一组 JButton 代表),我们 发现流式布局会将控件放在第一行,第一行满了自动放置在第二行,依次类推;而边界布局 会把控件分布在容器的东、南、西、北、中的五个区域;最后网格布局会把容器中的控件按 n 行 m 列均匀分布。
一旦使用任何布局,那么控件的坐标定位将失效。
如果在使用流式布局的容器中压入 JTextField 控件,那么这个 JTextField 的构造方法请 使用参数为 int 类型的构造方法:JTextField(int columns)。
java.awt.FlowLayout
流布局用于安排有方向的控件,这非常类似于段落中的文本行。如下表、为 FlowLayout 类的构造方法。
构造方法 | 说明 |
FlowLayout() | 创建一个新的流式布局管理器,居中对齐,默认的水平和 垂直间隙是 5 个单位 |
FlowLayout(int align) | 创建一个新的流式布局管理器,对齐方式是指定的,默认 的水平和垂直间隙是 5 个单位 |
FlowLayout(int align, int hgap, int vgap) | 创建一个新的流式布局管理器,具有指定的对齐方式以及 指定的水平和垂直间隙 |
FlowLayout 的常用方法如下表
方法 | 说明 |
setAlignment(int align) | 设置此布局的对齐方式 |
setHgap(int hgap) | 设置控件之间以及控件与 Container 的边之间的水平间隙 |
setVgap(int vgap) | 设置控件之间以及控件与 Container 的边之间的垂直间隙 |
JPanel 的无参构造方法默认就是流式布局。
流式布局
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FlowLayoutDemo extends JFrame {
private JPanel pnlMain;
private JButton btn1;
private JButton btn2;
private JButton btn3;
private JButton btn4;
private JButton btn5;
public FlowLayoutDemo() {
//该处代码也可以写成:pnlMain = new JPanel(new FlowLayout());
pnlMain = new JPanel();
btn1 = new JButton("按钮 1");
btn2 = new JButton("按钮 2");
btn3 = new JButton("按钮 3");
btn4 = new JButton("按钮 4");
btn5 = new JButton("按钮 5");
init();
}
private void init() {
//设置窗口属性
this.setTitle("测试流式布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将控件添加到容器上
pnlMain.add(btn1);
pnlMain.add(btn2);
pnlMain.add(btn3);
pnlMain.add(btn4);
pnlMain.add(btn5);
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建流式布局窗口*/
public static void main(String[ ] args) {
new FlowLayoutDemo();
}
}
java.awt. BorderLayout
布置容器的边界布局,它可以对容器上的控件进行安排,并调整其大小,使其符合下列 五个区域:南、北、东、西和中间区域。 如下表为 BorderLayout 类的构造方法。
构造方法 | 说明 |
BorderLayout() | 创建一个新的边界布局管理器,控件之间没有间隙 |
BorderLayout(int hgap, int vgap) | 创建一个新的边界布局管理器,控件之间的水平和垂直间 隙可以指定 |
BorderLayout 的常用方法如下表
方法 | 说明 |
setHgap(int hgap) | 设置控件之间的水平间隙 |
setVgap(int vgap) | 设置控件之间的垂直间隙 |
边界布局最多将容器分成 5 个区间,但是可以少,比如只有北、中、南,或是只有西、中、 东,或是按照需求具体划分。
边界布局
package com.gui;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BorderLayoutDemo extends JFrame {
private JPanel pnlMain;
private JButton btnN;
private JButton btnC;
private JButton btnS;
private JButton btnW;
private JButton btnE;
public BorderLayoutDemo() {
//将容器的布局设置为边界布局
pnlMain = new JPanel(new BorderLayout());
btnN = new JButton("按钮-北");
btnC = new JButton("按钮-中");
btnS = new JButton("按钮-南");
btnW = new JButton("按钮-西");
btnE = new JButton("按钮-东");
init();
}
private void init() {
//设置窗口属性
this.setTitle("测试边界布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
* 注意在使用边界布局的容器时,压入控件要以第 2 参数说明控件放在哪个位置;
* 否则,如果没有第 2 参数,默认在中间区域
*/
pnlMain.add(btnN,BorderLayout.NORTH);
pnlMain.add(btnC,BorderLayout.CENTER);
pnlMain.add(btnS,BorderLayout.SOUTH);
pnlMain.add(btnW,BorderLayout.WEST);
pnlMain.add(btnE,BorderLayout.EAST);
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建边界布局窗口*/
public static void main(String[] args) {
new BorderLayoutDemo();
}
}
java.awt. GridLayout
网格布局它以矩形网格形式对容器的控件进行布置。容器被分成大小相等的矩形,一个 矩形中放置一个控件。 如下表为 GridLayout 类的构造方法。
构造方法 | 说明 |
GridLayout() | 创建具有默认值的网格布局管理器,即每个空间占据一行 一列 |
GridLayout(int rows, int cols) | 创建具有指定行数和列数的网格布局管理器 |
GridLayout(int rows, int cols, int hgap, int vgap) | 创建具有指定行数和列数的网格布局管理器,行与行、列 与列之间具有指定的间隙值 |
GridLayout 的常用方法如下表
方法 | 说明 |
setColumns(int cols) | 设置网格布局中的列数 |
setRows(int rows) | 设置网格布局中的行数 |
setHgap(int hgap) | 设置控件之间的水平间隙 |
setVgap(int vgap) | 设置控件之间的垂直间隙 |
使用网格布局时,如果控件的数量过多或过少时,网格布局会自动调整,但是行数不会变化, 如:设置一个 2 行 3 列的网格,如果压入控件为 7 个,那么自动变为 2 行 4 列。
网格布局
package com.gui;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridLayoutDemo extends JFrame {
private JPanel pnlMain;
private JButton[ ] btnS;
public GridLayoutDemo() {
//将容器的布局设置为网格布局,指定布局为 3 行 4 列
pnlMain = new JPanel(new GridLayout(3, 4));
btnS = new JButton[12];
for(int i = 0;i < btnS.length;i++) {
btnS[i] = new JButton("按钮"+(i+1));
}
init();
}
private void init() {
//设置窗口属性
this.setTitle("测试网格布局");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将控件添加到容器上
for(JButton btn : btnS) {
pnlMain.add(btn);
}
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建网格布局窗口*/
public static void main(String[ ] args) {
new GridLayoutDemo();
}
}