一个容器中的各个组件之间的位置和大小关系就称为布局。Java语言提供了布局管理器来管理组件在容器中的布局,而不是直接使用位置坐标来设置各个组件的位置和大小。选择了容器之后,可以通过容器的setLayout()和getLayout()方法来确定布局(Layout),也就是限制容器中各个组件的位置和大小等。
Java提供了6中布局管理器,每个布局管理器都对应一种布局策略,分别是流式布局管理器(FlowLayout)、边界布局管理器(BorderLayout)、卡片布局管理器(CardLayout)、网格布局管理器(GridLayout)、网格包布局管理器(GridBagLayout)和网球布局管理器(BoxLayout)。

FlowLayout流式布局管理器

流式布局(FlowLayout)是最基本的一种布局。流式布局指的是把图形元件根据组件的preferredSize一个接一个地显示在面板上,如果一行显示不了所有的组件,会自动换到下一行显示。FlowLayout布局管理器是Panel、JApplet和JPanel默认的布局管理方式。
【例】流式布局管理器FlowLayout的应用。

package Swing;
import java.awt.*;
import javax.swing.*;
public class FlowLayout_Exam {
	static JFrame mainJFrame=new JFrame("流式布局管理器FlowLayout类的应用示例!");
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FlowLayout flow=new FlowLayout(FlowLayout.CENTER,5,10);
		mainJFrame.setSize(300, 200);
		Container container=mainJFrame.getContentPane();
		container.setLayout(flow);
		//将按钮对象btn加入到窗口内容面板中
		container.add(new JButton("JButton 1"));
		container.add(new JButton("JButton 2"));
		container.add(new JButton("JButton 3"));
		container.add(new JButton("Long-Named JButton 4"));
		container.add(new JButton("5"));
		//添加标签组件
		container.add(new JLabel("流式布局管理器FlowLayout"));
		//添加文本框组件
		container.add(new JTextField("流式布局策略FlowLayout",18));
		mainJFrame.setVisible(true);
	}
}

android java 布局管理器 java布局管理器的作用_Layout

BorderLayout边界布局管理器

边界布局管理器(BorderLayout)包括5个区:北区、南区、东区、西区和中区。这5个区在面板上的分布规律是“上北下南,左西右东”。将组件加入容器中时,应该指出把这个组件加在哪个区域中,若没有指定区域,则默认为中间。若将组件加入到已被占用位置时,将会取代原先的组件。BorderLayout是容器JFrame和对话框组件JDialog默认使用的布局管理器。
分布在北部和南部区域的组件将横向扩展至占据整个容器的长度,分布在东部和西部区域的组件将伸展至占据容器剩余部分的全部高度,最后剩余的部分将分配给位于中央区域的组件。如果某个区域没有分配组件,则其他组件可以占据它的空间。
在使用边界布局管理器BorderLayout时,利用add()方法向容器中添加组件时必须指出组件的摆放位置。组件的摆放位置主要包括BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH、BorderLayout.CENTER,共5类。
【例】边界布局管理器BorderLayout类的应用。

package Swing;
import java.awt.*;
import javax.swing.*;
public class BorderLayout_Exam {
	static JFrame mainJFrame=new JFrame("边界布局管理器的应用示例!");
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BorderLayout border=new BorderLayout(2,4);
		mainJFrame.setSize(250, 250);
		mainJFrame.setLocation(150, 150);
		Container container=mainJFrame.getContentPane();
		container.setLayout(border);//设置页面布局为BorderLayout
		container.setBackground(Color.green);//设置窗口底色为绿色
		container.add(new JButton("北"),BorderLayout.NORTH);
		container.add(new JButton("南"),BorderLayout.SOUTH);
		container.add(new JButton("东"),BorderLayout.EAST);
		container.add(new JButton("西"),BorderLayout.WEST);
		container.add(new JButton("中央"),BorderLayout.CENTER);
		mainJFrame.setVisible(true);
	}
}

android java 布局管理器 java布局管理器的作用_布局管理器_02


该程序创建了一个BorderLayout类的对象border,并设定组件的水平间距为5,垂直间距为10。通过调用add()方法将产生的5个命令按钮组件添加到窗口中,同时规定了该按钮在窗口中的摆放位置。

CardLayout卡片布局管理器

卡片布局管理器(CardLayout)把每个组件看做一张卡片,好像一副扑克牌,它们叠在一起,每次只有最外面的一个组件可以被看到,这个被显示的组件将占据所有的容器空间。在使用add()方法往窗口中添加组件时应对每个组件赋予一个名字,然后依据这个名字利用CardLayout类所提供的方法来控制其他组件是否显示。利用卡片布局管理器时,通常要用到多个容器,其中一个容器使用卡片布局管理器,而另外的容器使用其他布局管理器。
【例】卡片布局管理器CardLayout类的应用。

package Swing;
import java.awt.*;
import javax.swing.*;
public class CardLayout_Exam {
	static JFrame mainJFrame=new JFrame("卡片布局管理器类的应用示例!");
	static JPanel pnl1=new JPanel();
	static JPanel pnl2=new JPanel();
	static String[] str= {"第一页","上一页","下一页","最后页"};
	static CardLayout card=new CardLayout(5,10);//需将card定义为static类型
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		mainJFrame.setSize(360, 260);
		mainJFrame.setResizable(false);
		Container container=mainJFrame.getContentPane();
		container.setLayout(null);//取消内容面板的页面设置
		container.setBackground(Color.pink);//设置窗口底色为粉红色
		pnl1.setLayout(card);
		pnl1.setBounds(10, 10, 320, 160);
		pnl2.setLayout(new GridLayout(1,4));//将面板对象设置为1行4列的布局
		pnl2.setBounds(10, 180, 320, 35);
		for(int i=1;i<4;i++) {
			String str=new String("第"+i+"页");
			JTextField text=new JTextField("卡片策略布局!!"+str,30);
			//将文本组件text命名为t1后加入到面板中
			pnl1.add(text,"t"+i);
		}
		card.show(pnl1, "t3");
		for(int i=0;i<str.length;i++) {
			JButton b=new JButton(str[i]);
			pnl2.add(b);
		}
		container.add(pnl1);
		container.add(pnl2);
		mainJFrame.setVisible(true);
	}
}

android java 布局管理器 java布局管理器的作用_android java 布局管理器_03

该程序创建了一个窗口mainJFrame,两个面板对象pnl1和pnl2。pnl2设置成1行4列的网格页面布局,pnl1设置为卡片布局。两个面板通过add()方法添加到mainJFrame窗口中,pnl1面板上放置了3个文本框,pnl2面板上放置了4个命令按钮。

GridLayout网格布局管理器

网格布局管理器(GridLayout)将容器划分成若干行列的网格,在容器上添加组件时它们会从左到右、从上到下的顺序在网格中排列。在GridLayout的构造方法中,需要指定在容器上划分的网格的行、列数。利用GridLayout布局策略时,容器各组件的宽度相同,同样,所有组件的高度也是相同的。当容器的尺寸发生变化时,各组件的相对位置不变,但各自的尺寸会发生变化。
【例】利用网格布局管理器GridLayout设计一个简单的计算器。本例的思想是创建两个容器:一个是面板,另一个是窗口。首先把命令按钮摆放在面板中,然后再把文本框和面板放入窗口中。

package Swing;
import java.awt.*;
import javax.swing.*;
public class GridLayout_Exam extends JFrame {
	static JPanel pnl=new JPanel();
	static JTextField text=new JTextField("0");
	static String[] name= {"7","8","9","*","单位","4","5","6","/","M+","1","2","3","+","M-","0","00",".","-","="};
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GridLayout_Exam mainJFrame=new GridLayout_Exam();
		mainJFrame.setTitle("网格布局管理器类的应用示例!");
		mainJFrame.setSize(250, 300);
		mainJFrame.setResizable(false);//设置窗口的大小为不可改变
		mainJFrame.setLocationRelativeTo(null);
		Container container=mainJFrame.getContentPane();
		container.setLayout(null);//取消内容面板的页面设置
		text.setBounds(20, 10, 200, 30);
		text.setBackground(Color.yellow);//设置文本框的背景颜色
		text.setHorizontalAlignment(JTextField.RIGHT);
		GridLayout grid=new GridLayout(4,4);//创建4行4列的页面配置
		pnl.setLayout(grid);//将面板对象pnl的布局策略设为网格布局
		pnl.setBounds(20, 45, 200, 200);
		for(int i=0;i<name.length;i++) {
			JButton btn=new JButton(name[i]);
			btn.setSize(20, 20);
			btn.setMargin(new Insets(2,2,2,2));
			pnl.add(btn);
		}
		container.add(text);
		container.add(pnl);
		mainJFrame.setVisible(true);
	}
}

该程序创建了两个容器对象:一个是面板pnl,另一个是窗口mainJFrame。先将20个命令按钮放置在面板pnl中,然后把文本框text和pnl放到窗口mainJFrame的内容面板里。

GridBagLayout网格包布局管理器

网格包布局管理器(GridBagLayout)是Java中最有弹性但也是最复杂的一种管理器。它只有一种构造函数,但必须配合GridBagConstraints才能达到设置的效果。与基本的网格布局不同的是,一个组件可以跨越一个或多个网格,这样一来就增加了布局的灵活性。

BoxLayout盒式布局管理器

盒式布局管理器(BoxLayout)允许纵向或横向布置多个组件。作用类似于GridBagLayout,但没那么复杂。
对于所有方向,组件按照将它们添加到容器中的排列顺序。
BoxLayout试图按照组件的首选宽度(对于横向布局)或首选高度(对于纵向布局)来排列它们。对于横向布局,如果并不是所有的组件都具有相同的高度,则BoxLayout会试图让所有组件都具有最高组件的高度。如果对于某一特定组件而言这是不可能的,则BoxLayout会根据该组件的Y调整值对它进行纵向调整。默认情况下,组件的Y调整值为0.5,这意味着组件的纵向中心应该与其他Y调整值为0.5的组件的纵向中心具有相同的Y坐标。
同样,对于纵向布局,BoxLayout试图让列中的所有组件具有最宽组件的宽度。如果这样做失败,则BoxLayout会根据这些组件的X调整值对它进行横向调整。对于PAGE_AXIS布局,基于组件的开始边横向对齐。换句话说,如果容器的ComponentOrientation表示从左向右,则X调整值的0.0意味着组件的左边缘,否则它意味着组件的右边缘。
许多程序使用Box类,而不是直接使用BoxLayout。Box类是使用BoxLayout的轻量级容器。它还提供了一些有助于很好地使用BoxLayout的便利方法。要获得想要的排列,将组件添加到多个嵌套的Box中是一种功能强大的方法。

案例分析:布局管理器综合实例