java_Layout
布局管理器
|
所属类包 |
布局管理器名称 |
说明 |
|
Java.awt |
FlowLayout(流式布局) |
组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列 |
|
BorderLayout(边界布局) |
容器划分为东、西、南、北、中五个区域,每个区域只能放置一个组件。 |
|
|
GridLayout(网格布局) |
容器的空间划分成M×N列的网格区域, 每个区域只能放置一个组件。 |
|
|
CardLayout(卡片布局) |
如同一叠牌,每个牌对应一个组件,但每次只能显示其中的一张牌。适用于在一个空间中防止多个组件的情况 |
|
|
GridBagLayout(网格包布局) |
GridLayout的升级版,组件仍然是按照行、列放置,但是每个组件可以占据多个网格 |
|
|
Java.swing |
BoxLayout(箱式布局) |
允许在容器中纵向或者横向防止多个控件 |
|
SprigLayout(弹簧布局) |
根据一组约束条件放置控件 |
|
|
无 |
空布局 |
不使用布局管理器,按照控件自身提供的大小、位置信息放置控件 |
容器的默认布局管理器
|
容器 |
默认布局方式 |
|
|
顶层容器 |
JFrame |
BorderLayout(边界布局) |
|
JDialog |
BorderLayout(边界布局) |
|
|
JApplet |
FlowLayout(流式布局) |
|
|
中间容器 |
JPanel |
FlowLayout(流式布局) |
FlowLayout(流式布局)
使用FlowLayout布局方式的容器中组件按照加入的先后顺序按照设置的对齐方式(居中、左对齐、右对齐)从左向右排列,一行排满(即组件超过容器宽度后)到下一行开始继续排列。
流式布局特征如下:
组件按照设置的对齐方式进行排列,不管对齐方式如何,组件均按照从左到右的方式进行排列,一行排满,转到下一行。(比如按照右对齐排列,第一个组件在第一行最右边,添加第二个组件时,第一个组件向左平移,第二个组件变成该行最右边的组件,这就是从左向右方式进行排列)
流式布局FlowLayout类的常用构造函数和方法
|
构造函数 |
||
|
名称 |
用途 |
|
|
FlowLayout() |
构造一个新的 FlowLayout,它是默认居中对齐的,默认的水平和垂直间隙是5个像素 |
|
|
FlowLayout(int align) |
构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个像素 五个参数值及含义如下: 0或FlowLayout.lEFT ,控件左对齐 1或FlowLayout.CENTER ,居中对齐 2或FlowLayout.RIGHT ,右对齐 3或FlowLayout.LEADING,控件与容器方向开始边对应 4或FlowLayout.TRAILING,控件与容器方向结束边对应 如果是0、1、2、3、4之外的整数,则为左对齐 |
|
|
FlowLayout(int align, int hgap, int vgap) |
创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。 |
|
|
方法 |
||
|
名称 |
用途 |
|
|
Void setAlignment(int align) |
设置此布局的对齐方式。 |
|
|
void setHgap(int hgap) |
设置组件之间以及组件与 Container 的边之间的水平间隙。 |
|
|
void setVgap(int vgap) |
设置组件之间以及组件与 Container 的边之间的垂直间隙。 |
|
BorderLayout
边界布局管理器把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH。依次对应为:上北(NORTH)、下南(SOUTH)、左西(WEST)、右东(EAST),中(CENTER),如下图所示。

特征:
可以把组件放在这五个位置的任意一个,如果未指定位置,则缺省的位置是CENTER。
南、北位置控件各占据一行,控件宽度将自动布满整行。东、西和中间位置占据一行;若东、西、南、北位置无控件,则中间控件将自动布满整个屏幕。若东、西、南、北位置中无论哪个位置没有控件,则中间位置控件将自动占据没有控件的位置。
常见的构建函数和方法
|
构造方法摘要 |
||
|
BorderLayout(): 构造一个组件之间没有间距(默认间距为0像素)的新边框布局。 |
|
|
|
BorderLayout(int hgap, int vgap) : 构造一个具有指定组件(hgap为横向间距,vgap为纵向间距)间距的边框布局。 |
|
|
|
方法摘要 |
||
|
int |
getHgap() : 返回组件之间的水平间距。 |
|
|
int |
getVgap() : 返回组件之间的垂直间距。 |
|
|
void |
removeLayoutComponent(Component comp): 从此边框布局中移除指定组件。 |
|
|
void |
setHgap(int hgap): 设置组件之间的水平间距。 |
|
|
void |
setVgap(int vgap) : 设置组件之间的垂直间距。 |
|
实例
1 package study_小容器1;
2
3 import javax.swing.*;
4
5 import java.awt.*;
6
7 public class BorderLayout1 extends JFrame {
8
9 JPanel p=new JPanel();
10
11 public BorderLayout1(){
12
13 setLayout(new BorderLayout(5,5));
14
15 setFont(new Font("Helvetica", Font.PLAIN, 14));
16
17 getContentPane().add("North", new JButton("North"));
18
19 getContentPane().add("South", new JButton("South"));
20
21 getContentPane().add("East", new JButton("East"));
22
23 getContentPane().add("West", new JButton("West"));
24
25 //设置面板为流式布局居中显示,组件横、纵间距为5个像素
26
27 p.setLayout(new FlowLayout(1,5,5));
28
29 //使用循环添加按钮,注意每次添加的按钮对象名称都是b
30
31 //但按钮每次均是用new新生成的,所有代表不同的按钮对象。
32
33 for(int i=1;i<10;i++){
34
35 //String.valueOf(i),将数字转换为字符串
36
37 JButton b=new JButton(String.valueOf(i));
38
39 p.add(b); //将按钮添加到面板中
40
41 }
42
43 getContentPane().add("Center",p); //将面板添加到中间位置
44
45 }
46
47 public static void main(String args[]) {
48
49 BorderLayout1 f = new BorderLayout1();
50
51 f.setTitle("边界布局");
52
53 f.pack(); //让窗体自适应组建大小
54
55 f.setVisible(true);
56
57 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
58
59 f.setLocationRelativeTo(null); //让窗体居中显示
60
61 }
62
63 }
GridLayout
网格布局特点:
使容器中的各组件呈M行×N列的网格状分布。
网格每列宽度相同,等于容器的宽度除以网格的列数。
网格每行高度相同,等于容器的高度除以网格的行数。
各组件的排列方式为:从上到下,从左到右。
组件放入容器的次序决定了它在容器中的位置。
容器大小改变时,组件的相对位置不变,大小会改变。
设置网格布局行数和列数时,行数或者列数可以有一个为零。若rows为0,cols为3,则列数固定为3,行数不限,每行只能放3个控件或容器。若cols为0,rows为3,则行数固定为3,列数不限,且每行必定有控件,若组件个数不能整除行数,则除去最后一行外的所有行组件个数为:Math.ceil(组件个数/rows)。
Math.ceil(double x):传回不小于x的最小整数值。比如行数为3,组件数为13个,则Math.ceil(13/3)=5,即第一行,第二行组件数各为5个,剩下的组件放在最后一行。
若组件数超过网格设定的个数,则布局管理器会自动增加网格个数,原则是保持行数不变。
|
构造方法摘要 |
|
GridLayout(): 创建具有默认值的网格布局,即每个组件占据一行一列。 |
|
GridLayout(int rows, int cols) : 创建具有指定行数和列数的网格布局。Rows为行数,cols为列数。 |
|
GridLayout(int rows, int cols, int hgap, int vgap) : 创建具有指定行数、列数以及组件水平、纵向一定间距的网格布局。 |
|
方法摘要 |
|
|
int |
getColumns() :获取此布局中的列数。 |
|
int |
getHgap():获取组件之间的水平间距。 |
|
int |
getRows() :获取此布局中的行数。 |
|
int |
getVgap() :获取组件之间的垂直间距。 |
|
void |
removeLayoutComponent(Component comp) :从布局移除指定组件。 |
|
void |
setColumns(int cols) :将此布局中的列数设置为指定值。 |
|
void |
setHgap(int hgap):将组件之间的水平间距设置为指定值。 |
|
void |
setRows(int rows):将此布局中的行数设置为指定值。 |
|
void |
setVgap(int vgap) :将组件之间的垂直间距设置为指定值。 |
|
toString():返回此网格布局的值的字符串表示形式。 |
|
1 package study_小容器1; 2 import java.awt.*; 3 import javax.swing.*; 4 public class GridLayout1 extends JFrame{ 5 JPanel p=new JPanel(new GridLayout(4,4,3,3));//定义面板,并设置为网格布局,4行4列,组件水平、垂直间距均为3 6 JTextField t=new JTextField(); //定义文本框 7 String str[]={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"};//定义字符串数组,为按钮的显示文本赋值 8 public GridLayout1(String s){ 9 super(s); 10 setLayout(new BorderLayout()); //定义窗体布局为边界布局 11 JButton btn[]; //声明按钮数组 12 btn=new JButton[str.length]; //创建按钮数组 13 for(int i=0;i<str.length;i++){//循环定义按钮,并添加到面板中 14 btn[i]=new JButton(str[i]); 15 p.add(btn[i]); 16 17 } 18 getContentPane().add(t,BorderLayout.NORTH); //将文本框放置在窗体NORTH位置 19 getContentPane().add(p,BorderLayout.CENTER); //将面板放置在窗体CENTER位置 20 setVisible(true); 21 setSize(250,200); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 setLocationRelativeTo(null); //让窗体居中显示 24 } 25 public static void main(String[] args){ 26 GridLayout1 gl=new GridLayout1("网格布局"); 27 } 28 }
CardLayout
卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件叠在一起,初始时显示该空间中第一个添加的组件,通过CardLayout类提供的方法可以切换该空间中显示的组件

使用CardLayout类提供的方法可以切换显示该空间中的组件
(1) 定义使用卡片布局的容器
例如:Panel cardPanel=new Panel();
(2) 定义卡片对象:CardLayout 布局对象名称=new CardLayout();
例如:CardLayout card=new CardLayout();
(3) 设置使用卡片布局的容器为卡片布局:
格式:容器名称.setLayout(布局对象名称);
例如:cardPanel.setLayout(card);
(4) 设置容器中显示的组件
例如:for (int i = 0; i < 5; i++) {
cardPanel.add(newJButton("按钮"+i));
}
(5) 定义响应事件代码,让容器显示相应的组件
布局对象名称.next(容器名称) 显示容器中当前组件之后的一个组件,若当前组件为最后添加的组件,则显示第一个组件,即卡片组件显示是循环的。
布局对象名称.first(容器名称) 显示容器中第一个组件
布局对象名称.last(容器名称) 显示容器中最后一个组件
布局对象名称.previous(容器名称) 显示容器中当前组件之前的一个组件,若当前组件为第一个添加的组件,则显示最后一个组件,即卡片组件显示是循环的.
或者卡片对象名称.show(容器名称,卡片名称)
例如
card.next(cardPanel);
card.previous(cardPanel);
card.first(cardPanel);
card.last(cardPanel);
1 package study_小容器1; 2 //cardlayout.java 3 import java.awt.*; 4 5 import javax.swing.*; 6 7 import java.awt.event.*;//引入事件包 8 //定义类时实现监听接口 9 public class cardlayout extends JFrame implements ActionListener{ 10 JButton nextbutton; 11 JButton preButton; 12 JButton firstButton; 13 Panel cardPanel=new Panel(); 14 Panel controlpaPanel=new Panel(); 15 //定义卡片布局对象 16 CardLayout card=new CardLayout(); 17 //定义构造函数 18 public cardlayout() { 19 super("卡片布局管理器"); 20 setSize(300, 200); 21 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 22 setLocationRelativeTo(null); 23 setVisible(true); 24 //设置cardPanel面板对象为卡片布局 25 cardPanel.setLayout(card); 26 //循环,在cardPanel面板对象中添加五个按钮 27 //因为cardPanel面板对象为卡片布局,因此只显示最先添加的组件 28 for (int i = 0; i < 5; i++) { 29 cardPanel.add(Integer.toString(i),new JButton(i+"图片")); 30 } 31 //实例化按钮对象 32 nextbutton=new JButton("下一张卡片"); 33 preButton=new JButton("上一张卡片"); 34 firstButton=new JButton("第一张"); 35 //为按钮对象注册监听器 36 nextbutton.addActionListener(this); 37 preButton.addActionListener(this); 38 firstButton.addActionListener(this); 39 controlpaPanel.add(preButton); 40 controlpaPanel.add(nextbutton); 41 controlpaPanel.add(firstButton); 42 //定义容器对象为当前窗体容器对象 43 Container container=getContentPane(); 44 //将 cardPanel面板放置在窗口边界布局的中间,窗口默认为边界布局 45 container.add(cardPanel,BorderLayout.CENTER); 46 // 将controlpaPanel面板放置在窗口边界布局的南边, 47 container.add(controlpaPanel,BorderLayout.SOUTH); 48 } 49 //实现按钮的监听触发时的处理 50 public void actionPerformed(ActionEvent e){ 51 if (e.getSource()==nextbutton){ 52 card.next(cardPanel); 53 } 54 if (e.getSource()==preButton){ 55 card.previous(cardPanel); 56 } 57 if (e.getSource()==firstButton){ 58 card.show(cardPanel,"0"); 59 } 60 } 61 public static void main(String[] args) { 62 cardlayout kapian=new cardlayout(); 63 } 64 }

浙公网安备 33010602011771号