Java学习日记:布局和面板

布局

今天学习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();

	}

}

运行结果:
Java学习日记:布局和面板_第1张图片

流布局(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();

	}

}

运行结果:
Java学习日记:布局和面板_第2张图片

边界布局(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();

	}

}

运行结果:
Java学习日记:布局和面板_第3张图片

网格布局

网格布局将容器划分为王国,组件可以按行和列进行排列,每个组件大小相同,网格中空格的个数有行数和列数决定。组件从网格左上角开始,按照从左到右、从上到下的顺序依次加入到网格中。
常用的构造方法有两种:
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();

	}

}

运行结果:
Java学习日记:布局和面板_第4张图片

面板

面板也是一种容器,可以用来容纳其他的组件,不同的一点在于他不能作为底部的容器,必须添加到其他容器中。

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();
	}
}

运行结果:
Java学习日记:布局和面板_第5张图片

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();
		
	}
	
}

运行结果:
Java学习日记:布局和面板_第6张图片

今天就先到这叭~

一步两步,慢慢进步~~

你可能感兴趣的:(java)