布局
今天学习Swing组件时,看到了布局。布局,顾名思义就是将组件在容器中依据各种不同的方法进行摆放,可以用来提高使用者的体验。
在Swing组件中也提供了一些布局管理器,他们依据不同的排列方法而命名,包括流布局、边界布局、网格布局。
此外,还有一个叫绝对布局,就是硬性规定各个组件的位置和大小,这种通常采用绝对坐标的方式,我们只要设定坐标即可。
绝对布局
绝对布局使用绝对坐标的方式来指定组件的位置,大致步骤如下:
1)先使用Container.setLayout(null)取消布局管理器;
2)使用Compinent.setBounds()方法设置每个组件的大小与位置。
/*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建AbsolutePosition类,设置布局管理器为null,使用绝对定位布局方式,创建两个按钮,
* 分别定位在窗体不同位置上。
*/
package exercise13;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class AbsolutePosition extends JFrame{
public AbsolutePosition(){
setTitle("本窗体使用绝对布局"); //设置窗体标题
setLayout(null); //取消布局管理器设置
setBounds(0,0,400,150); //绝对定位窗体的位置与大小
Container c = getContentPane(); //创建容器
JButton b1 = new JButton("按钮1"); //创建按钮1
JButton b2 = new JButton("按钮2"); //创建按钮2
b1.setBounds(10,30,80,30); //设置按钮位置和大小
b2.setBounds(60,70,100,20);
c.add(b1);
c.add(b2); //添加按钮到容器中
setVisible(true); //使窗体可见
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方式
}
public static void main(String[] args) {
new AbsolutePosition();
}
}
运行结果:
流布局(FlowLayout)
正如其名,流布局管理器可以像“流”一样从左到右摆放组件,直至占据当前一行的所有空间,然后向下移动一行。默认情况下,组件在每一行都是居中排列,通过设置可以更改组件在每一行上的排列位置。
FlowLayout类中常用的构造方法:
public FlowLayout();
public FlowLayout(int alignment);
public FlowLayout(int alignment,int horizGap,int vertGap);
其中参数alignment表示组件放置在每一行的具体位置,可以被赋值为0(Left),1(CENTER),2(RIGHT)。
参数horizGap和vertGap分别代表以像素为单位指定组件之间的水平间隔与垂直间隔。
/*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建FlowLayoutPosition类,该类继承JFrame类成为窗体组件。
* 设置该窗体的布局管理器为FlowLayout布局管理器的实例对象。
*/
package exercise13;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class FlowLayoutPosition extends JFrame{
public FlowLayoutPosition() {
setTitle("本窗体使用流布局管理器"); //设置窗体标题
Container c = getContentPane();
//设置窗体中的布局,组件右对齐,水平与垂直间隔均为10
setLayout(new FlowLayout(2,10,10));
for(int i = 0;i<10;i++) {
c.add(new JButton("button" + i));
}
setSize(300,200); //设置窗体大小
setVisible(true); //设置窗体可见
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//设置窗体关闭方式
}
public static void main(String[] args) {
new FlowLayoutPosition();
}
}
运行结果:
边界布局(BorderLayout)
当不指定窗体布局结构时,默认采用的布局就是边界布局。
如果容器中只有一个标签组件,使用边界布局的话就会使组件占据窗体所有空间。
如果有多个组件,边界布局管理器可以按照将容器划分为东、西、南、北、中5个区域将组件分别加入。
/*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建BorderLayoutPosition类,该类继承JFrame类成为窗体组件。
* 设置该窗体的布局管理器为BorderLayout布局管理器的实例对象。
*/
package exercise13;
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class BorderLayoutPosition extends JFrame{
//定义组件摆放位置的数组
String[] border = {BorderLayout.CENTER,BorderLayout.EAST,
BorderLayout.NORTH,BorderLayout.WEST,BorderLayout.SOUTH}; //位置
String[] ButtonName = {"center button" , "east button",
"borth button","west button","south button"}; //名称
public BorderLayoutPosition(){
setTitle("这个窗体使用边界布局管理器"); //定义窗体标题
Container c = getContentPane(); //定义一个容器
setLayout(new BorderLayout());
for(int i = 0;i <border.length;i++) {
//在容器中添加按钮
c.add(border[i],new JButton(ButtonName[i]));
}
setSize(350,200); //设置窗体大小
setVisible(true); //设置窗体可见
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //设置窗体关闭方式
}
public static void main(String[] args) {
new BorderLayoutPosition();
}
}
运行结果:
网格布局
网格布局将容器划分为王国,组件可以按行和列进行排列,每个组件大小相同,网格中空格的个数有行数和列数决定。组件从网格左上角开始,按照从左到右、从上到下的顺序依次加入到网格中。
常用的构造方法有两种:
1)public GirdLayout(int rows,int columns)
2)public GridLayout(int rows,int columns,int horizGap,int vertGap)
其中,rows代表行数,columns代表列数,horizGap代表网格间的水平距离,vertGap代表网格间的垂直距离。
/*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建GirdLayoutPosition类,该类继承JFrame类成为窗体组件,
* 设置该窗体使用网格布局管理器。
*/
package exercise13;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class GirdLayoutPosition extends JFrame{
public GirdLayoutPosition() {
Container c = getContentPane();
//在容器中设置一个7行3列的网格
setLayout(new GridLayout(7,3,5,5));
for(int i = 0;i<20;i++) {
c.add(new JButton("button" + i));//添加按钮
}
setSize(300,300);
setTitle("这是一个网格布局窗体");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new GirdLayoutPosition();
}
}
运行结果:
面板
面板也是一种容器,可以用来容纳其他的组件,不同的一点在于他不能作为底部的容器,必须添加到其他容器中。
JPanel面板——大窗小格
JPanel面板可以用于在一个大的窗体中增加多个小的面板。
/*
*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建JPanelTest类,该类继承JFrame类成为窗体组件,
* 创建四个面板组件,并添加到窗体中。
*/
package exercise13;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class JPanelTest extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public JPanelTest() {
Container c = getContentPane();
// 将整个容器设置为2行1列的网格布局
c.setLayout(new GridLayout(2, 1, 10, 10));
// 初始化一个面板,设置1行3列的网格布局
JPanel p1 = new JPanel(new GridLayout(1, 3, 10, 10));
JPanel p2 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
p1.add(new JButton("1")); // 在面板中添加按钮
//p1.add(new JButton("1"));
p1.add(new JButton("2"));
p1.add(new JButton("3"));
p2.add(new JButton("4"));
p2.add(new JButton("5"));
p3.add(new JButton("6"));
p3.add(new JButton("7"));
p4.add(new JButton("8"));
p4.add(new JButton("9"));
c.add(p1); // 在容器中添加面板
c.add(p2);
c.add(p3);
c.add(p4);
setTitle("在这个窗体中使用了面板");
setSize(420, 200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelTest();
}
}
运行结果:
JScrollPane面板——小窗多字
当一个窗体中容纳不下所需的内容时,就需要用到JScrollPane。这是一种带滚动条的面板,也是一种容器,不过它只能放一个组件,而且不能使用布局。如果想放多个组件的话需要先将组件放置在JPanel中,再将JPanel作为一个整体放置在JScrollPane中。
/*
*
* @author:jiacy
* @date:2020-2-11
* @version:V1.0
* 创建JScrollPaneTest类,该类继承JFrame类成为窗体组件,
* 在类中创建JScrollPane滚动面板组件,该滚动面板组件包含JTextArea文本域组件。
*/
package exercise13;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
public class JScrollPaneTest extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public JScrollPaneTest() {
Container c = getContentPane(); // 创建容器
JTextArea ta = new JTextArea(20, 50); // 创建文本区域组件
JScrollPane sp = new JScrollPane(ta); // 创建JScrollPane面板对象
c.add(sp); // 将该面板添加到该容器中
setTitle("带滚动条的文字编译器");
setSize(200, 200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollPaneTest();
}
}
运行结果:
今天就先到这叭~
一步两步,慢慢进步~~