1.概述
组件在容器中的位置和尺寸是由布局管理器来决定的。所有的容器都会引用一个布局管理器实例,通过它来自动进行组件的布局管理。
2.分类
java.awt包提供了5种布局管理器:
- FlowLayout流式布局管理器;
- BorderLayout边框布局管理器;
- GridLayout网格布局管理器;
- CardLayout卡片布局管理器;
- GridBagLayout网格包布局管理器;
javax.swing包提供了一种BoxLayout盒式布局管理器
3.使用
- FlowLayout流式布局管理器
最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。 FlowLayout允许以左对齐、居中对齐(默认方式)或右对齐的方式排列组件。
package com.demo;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FlowLayoutTest {
public static void main(String[] args) {
//1.创建容器
JFrame jFrame = new JFrame("流式");
//2.创建面板
JPanel jPanel = new JPanel();
//3.创建组件
JButton btn = new JButton("btn1");
JButton btn2 = new JButton("btn2");
JButton btn3 = new JButton("btn3");
//4.设置布局管理器
jPanel.setLayout(new FlowLayout());
//5.将组件添加到面板中
jPanel.add(btn3);
jPanel.add(btn2);
jPanel.add(btn);
//6.将面板添加到容器中
jFrame.add(jPanel);
//7.设置容器大小
jFrame.setSize(400,500);
//8.设置容器可见性
jFrame.setVisible(true);
//9.关闭窗口
jFrame.setDefaultCloseOperation(3);
}
}
-
BorderLayout边界布局管理器
将容器分为五个区域:东、南、西、北和中。对于采用BorderLayout的容器,当它用add()方法添加一个组件时,可以同时为组件指定在容器中的区域。
void add(Component comp, Object constraints)
这里的constraints是String类型,可选值为BorderLayout提供的五个常量:
-
BorderLayout.NORTH: 北区域,值为"North";
-
BorderLayout.SOUTH: 南区域,值为"South";
-
BorderLayout.EAST: 东区域,值为"East";
-
BorderLayout.WEST: 西区域,值为"West";
-
BorderLayout.CENTER: 中区域,值为"Center";
-
package com.demo;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BorderLayoutTest {
public static void main(String[] args) {
//1.创建容器
JFrame jFrame = new JFrame("边界");
//2.创建面板
JPanel jPanel = new JPanel();
//3.创建组件
JButton btn = new JButton("btn");
JButton btn2 = new JButton("btn2");
JButton btn3 = new JButton("btn3");
JButton btn4 = new JButton("btn4");
JButton btn5 = new JButton("btn5");
//4.设置布局管理器
jPanel.setLayout(new BorderLayout());
//5.添加组件到面板
jPanel.add(btn, BorderLayout.CENTER);
jPanel.add(btn2, BorderLayout.NORTH);
jPanel.add(btn3, BorderLayout.SOUTH);
jPanel.add(btn4, BorderLayout.WEST);
jPanel.add(btn5, BorderLayout.EAST);
//6.添加面板到容器
jFrame.add(jPanel);
//7.设置容器大小
jFrame.setSize(400, 500);
//8.设置可见性
jFrame.setVisible(true);
//9.关闭窗口
jFrame.setDefaultCloseOperation(3);
}
}
- GridLayout网格布局管理器
GridLayout将容器分割成许多行和列,组件被填充到每个网格中。添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,直至占满该行的所有网络,接着继续在下一行中从左到右放置组件。
package com.demo;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridLayoutTest {
public static void main(String[] args) {
//1.创建容器
JFrame jFrame = new JFrame("网格");
//2.创建面板
JPanel jPanel = new JPanel();
//3.设置布局管理器
jPanel.setLayout(new GridLayout(2,2));
//4.创建组件
JButton btn = new JButton("btn");
JButton btn2 = new JButton("btn2");
JButton btn3 = new JButton("btn3");
JButton btn4 = new JButton("btn4");
//5.添加组件到面板
jPanel.add(btn);
jPanel.add(btn2);
jPanel.add(btn3);
jPanel.add(btn4);
//6.添加面板到容器
jFrame.add(jPanel);
//7.设置容器大小
jFrame.setSize(400, 400);
//8.设置容器可见性
jFrame.setVisible(true);
//9.关闭窗口
jFrame.setDefaultCloseOperation(3);
}
}
- CardLayout卡片布局管理器
将界面看做一系列的卡片,在任何时侯只有其中一张卡片是可见的,这张卡片占据容器的整个区域。
package com.demo;
import java.awt.Button;
import java.awt.CardLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CardLayoutTest {
public static void main(String[] args) {
//1.创建容器
JFrame jFrame = new JFrame("卡片");
//2.创建面板
JPanel jPanel = new JPanel();
//3.设置布局管理器
jPanel.setLayout(new CardLayout());
//4.创建组件
Button btn = new Button("b");
Button btn2 = new Button("bt");
Button btn3 = new Button("btn");
//5.添加组件到面板
jPanel.add(btn);
jPanel.add(btn2);
jPanel.add(btn3);
//6.添加面板到容器
jFrame.add(jPanel);
//7.设置容器大小
jFrame.setSize(400,400);
//8.设置容器可见性
jFrame.setVisible(true);
//9.关闭窗口
jFrame.setDefaultCloseOperation(3);
}
}
- GridBagLayout网格包布局管理器
在网格的基础上提供更为复杂的布局。和GridLayout不同, GridBagLayout允许容器中各个组件的大小各不相同,还允许单个组件所在的显示区域占据多个网格。
package com.demo;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridBagLayoutTest {
public static void main(String[] args) {
// 1.创建容器
JFrame jFrame = new JFrame("网格包");
// 2.创建面板
JPanel jPanel = new JPanel();
// 3.设置布局管理器
GridBagLayout gridBagLayout = new GridBagLayout();
jPanel.setLayout(gridBagLayout);
// 4.创建GridBagConstraints对象
GridBagConstraints constraints = new GridBagConstraints();
// 设置网格的左上角的x坐标
constraints.gridx = 1;
// 设置网格的左上角的y坐标
constraints.gridy = 1;
// 设置网格的宽度
constraints.gridwidth = 1;
// 设置网格的高度
constraints.gridheight = 1;
// 5.创建组件
JButton btn = new JButton("btn");
gridBagLayout.setConstraints(btn, constraints);
// 6.添加组件到面板
jPanel.add(btn);
constraints.gridx = 2;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
JButton btn2 = new JButton("btn2");
gridBagLayout.setConstraints(btn2, constraints);
jPanel.add(btn2);
JButton btn3 = new JButton("btn3");
constraints.gridx = 1;
constraints.gridy = 2;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.fill = GridBagConstraints.BOTH;
gridBagLayout.setConstraints(btn3, constraints);
jPanel.add(btn3);
// 7.添加面板到容器
jFrame.add(jPanel);
// 8.设置容器大小
jFrame.setSize(400, 400);
// 9.设置容器可见性
jFrame.setVisible(true);
//10.关闭窗口
jFrame.setDefaultCloseOperation(3);
}
}