1.LayoutManager布局管理器

  在之前的学习中,我们使用setBounds()方法设置容器的位置大小,但我们不得不明白一件事--如果我们手动为容器设置位置大小的话,就会造成程序通用性的下降。 

1 import java.awt.*;
2
3 public class LabelDemo {
4 public static void main(String[] args) {
5 Label label = new Label("Hello world");
6 }
7 }

  在该代码中,我们定义了一个Label。在很多情况下,我们需要让label的宽高和"Hello world"这个字符串自身的宽高一样,这个宽高被称为“最佳大小”。

  在Windows上,我们需要将宽高设置为100px,20px。但在Linux上,为了达到相同的效果,我们需要将宽高设置为120px,24px。

  一个拥有上千个组件的大型程序中,为了达到各平台相同的视觉效果,其手动调整工作无疑是一场灾难。为了解决这一个问题,LayoutManager诞生了。

2.体系

(接口)LayoutManager

  -GridLayout(网格布局)

  -FlowLayout(流式布局)

  -(接口)LayoutManager2

    -CardLayout(卡片布局)

    -GridBagLayout(网格包布局)

    -BorderLayout(边框布局)

3.五种布局管理器

3.1 FlowLayout 流式布局

3.1.1 简介

  FlowLayout布局管理器中,组件像是流水一般向某方向流动(排列),遇到障碍(边界)就折回,另起一行重新开始。一般情况下,FlowLayout的排列方向是从左向右。

方法名 说明
FlowLayout() 使用默认的对齐方式、默认的垂直间距和默认的水平间距创建LayoutManager布局管理器。
FlowLayout(int align) 使用指定的对齐方式、默认的垂直间距和默认的水平间距创建LayoutManager布局管理器。
FlowLayout(int align,int hgap,int vgap) 使用指定的对齐方式、指定的垂直间距和指定的水平间距创建LayoutManager布局管理器。

  FlowLayout布局管理器的排列方向,从左向右、从右向左、从中间向两边,该参数使用FlowLayout类的静态常量:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER。

  水平和垂直间距的单位是px,默认是5px。

3.1.2 代码演示

1.添加一个窗口

2.设置布局管理器

3.添加组件

4.设置大小、pack方法

 1 import java.awt.*;
2
3 public class setFlowLayoutDemo {
4 public static void main(String[] args) {
5 Frame f = new Frame("FlowLayoutDemo");
6 f.setLayout(new FlowLayout(FlowLayout.CENTER,20,20));
7
8 for (int i = 0;i<10;i++){
9 f.add(new Button("按钮"+i));
10 }
11 f.pack();
12 f.setVisible(true);
13 }
14 }

3.2 BorderLayout 边框布局

3.2.1 简介

  BorderLayout边框布局将容器分为North、South、West、East、Center五个区域,普通的组件可以放在这五个区域中任意一个。

  当改变BorderLayout的大小时,North、South、Center水平调整,而West、East、Center垂直调整(竖着的横着调,横着的竖着调,中间的全部调)。

  注意:

    1.当向使用BorderLayout布局的容器中添加组件时,需要指定组件的区域,如果没有指定默认添加到Center。

    2.当向一个区域添加多个组件时,后放入的组件会覆盖先放入的组件。

  

方法名 说明
Borderlayout() 使用默认的垂直与水平间距创建BorderLayout布局
BorderLayout(int hgap,int vgap) 使用指定的垂直与水平间距创建BorderLayout布局

3.2.2 代码演示

 1 import java.awt.*;
2
3 public class setBorderLayoutDemo {
4 public static void main(String[] args) {
5 Frame f = new Frame("BorderLayoutDemo");
6
7 f.setLayout(new BorderLayout(30,5));
8
9 f.add(new Button("北按钮"),BorderLayout.NORTH);
10 f.add(new Button("南按钮"),BorderLayout.SOUTH);
11 f.add(new Button("东按钮"),BorderLayout.EAST);
12 f.add(new Button("西按钮"),BorderLayout.WEST);
13 f.add(new Button("中按钮"),BorderLayout.CENTER);
14
15 f.pack();
16
17 f.setVisible(true);
18
19 }
20 }
 1 import java.awt.*;
2
3 public class setBorderLayoutDemo {
4 public static void main(String[] args) {
5 Frame f = new Frame("BorderLayoutDemo");
6
7 f.setLayout(new BorderLayout(30, 5));
8
9 f.add(new Button("北按钮"), BorderLayout.NORTH);
10 f.add(new Button("南按钮"), BorderLayout.SOUTH);
11 // f.add(new Button("东按钮"),BorderLayout.EAST);
12 // f.add(new Button("西按钮"),BorderLayout.WEST);
13 // f.add(new Button("中按钮"),BorderLayout.CENTER);
14 Panel p = new Panel();
15 p.add(new TextField(20));
16 p.add(new Button("中间按钮"));
17
18 f.add(p);
19
20 f.pack();
21
22 f.setVisible(true);
23
24 }
25 }

3.3 GridLayout 网格布局

3.3.1 简介

  GridLayout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相同。当向使用GridLayout布局的容器中添加组件时,默认从左向右、从上向下,依次添加到每个网格中。与FlowLayout不同的是,放置在GridLayout布局管理器中的组件大小由组件所处的区域决定(每个组件将占满整个区域)。

方法名 说明
GridLayout(int rows,int cols) 使用指定的行数、列数以及默认的垂直间距和默认的水平间距创建GridLayout布局管理器。
GridLayout(int rows,int cols,int hgap,int vgap) 使用指定的行数、列数以及指定的垂直间距和指定的水平间距创建GridLayout布局管理器。

3.3.2 代码演示

 1 import java.awt.*;
2
3 public class setGridLayout {
4 public static void main(String[] args) {
5 Frame f = new Frame("计算器");
6 Panel pp = new Panel();
7 pp.add(new TextField(30));
8
9 f.add(pp,BorderLayout.NORTH);
10
11 Panel p = new Panel();
12 p.setLayout(new GridLayout(3,5,4,4));
13 p.add(new Button("1"));
14 p.add(new Button("2"));
15 p.add(new Button("3"));
16 p.add(new Button("4"));
17 p.add(new Button("5"));
18 p.add(new Button("6"));
19 p.add(new Button("7"));
20 p.add(new Button("8"));
21 p.add(new Button("9"));
22 p.add(new Button("0"));
23 p.add(new Button("+"));
24 p.add(new Button("-"));
25 p.add(new Button("*"));
26 p.add(new Button("/"));
27 p.add(new Button("%"));
28
29 f.add(p);
30
31 f.pack();
32
33 f.setVisible(true);
34 }
35 }

3.4 GridBagLayout 网格包布局

  GridBagLayout布局是功能最强大也最复杂,与GridLayout不同,在GridBagLayout中组件可以跨过一个或多个网格且可以设置各个网格大小不同,从而增加了网格布局的灵活性。当窗口的大小发生变化时,GridBagLayout也可以准确的控制窗口各部分的拉伸。

  由于在GridBagLayout中组件可以跨越网格,所以在往容器内添加组件时,需要具体的控制每个组件占用多少个网格,Java提供GridBagConstraints,与特定的组件绑定,可以完成具体大小和跨越性的设置。

3.5 CardLayout 卡片布局

  CardLayout布局管理器以时间而非空间来管理其中的组件,它将加入容器中的组件看成一叠卡片(每一张卡片其实就是一个组件),每次只有最上面的Component可见。

方法名 说明
CardLayout() 创建默认的CardLayout布局
CardLayout(int hgap,int vgap) 使用指定的水平间距、垂直间距创建CardLayout
first(Container target) 显示target容器中的第一张卡片
last(Container target) 显示target容器中的最后一张卡片
previous(Container target) 显示target容器中的前一张卡片
next(Container target) 显示target容器中的后一张卡片
show(Container target,String name) 显示target容器中指定名字的那一张卡片
 1 import java.awt.*;
2 import java.awt.event.ActionEvent;
3 import java.awt.event.ActionListener;
4
5 public class setCardLayout {
6 public static void main(String[] args) {
7 Frame f = new Frame("CardLayout");
8
9 Panel p1 = new Panel();
10 CardLayout cl = new CardLayout();
11 p1.setLayout(cl);
12
13 String[] names = {"第一张","第二张","第三张","第四张","第五张"};
14 for (int i = 0;i< names.length;i++){
15 p1.add(names[i],new Button(names[i]));
16 }
17
18 f.add(p1);
19
20 Panel p2 = new Panel();
21
22 Button b1 = new Button("第一张");
23 Button b2 = new Button("上一张");
24 Button b3 = new Button("第三张");
25 Button b4 = new Button("下一张");
26 Button b5 = new Button("最后一张");
27
28 ActionListener al = new ActionListener() {
29 @Override
30 public void actionPerformed(ActionEvent e) {
31 String command = e.getActionCommand();
32 switch (command){
33 case "第一张":
34 cl.first(p1);
35 break;
36 case "上一张":
37 cl.previous(p1);
38 break;
39 case "第三张":
40 cl.show(p1,"第三张");
41 break;
42 case "下一张":
43 cl.next(p1);
44 break;
45 case "最后一张":
46 cl.last(p1);
47 break;
48 }
49 }
50 };
51
52 b1.addActionListener(al);
53 b2.addActionListener(al);
54 b3.addActionListener(al);
55 b4.addActionListener(al);
56 b5.addActionListener(al);
57
58 p2.add(b1);
59 p2.add(b2);
60 p2.add(b3);
61 p2.add(b4);
62 p2.add(b5);
63
64 f.add(p2,BorderLayout.SOUTH);
65
66 f.pack();
67
68 f.setVisible(true);
69 }
70 }

3.6 BoxLayout 盒布局

  BoxLayout是为了简化开发由Swing引入的,可以在垂直和水平两个方向上摆放组件。

方法名 说明
BoxLayout(Container target,int axis) 指定创建基于target容器的BoxLayout布局管理器,该布局管理器里的组件会按照axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)。
 1 import javax.swing.*;
2 import java.awt.*;
3
4 public class setBoxLayout {
5 public static void main(String[] args) {
6 Frame frame = new Frame("BoxLayout");
7
8 BoxLayout box = new BoxLayout(frame, BoxLayout.X_AXIS);
9
10 frame.setLayout(box);
11
12 frame.add(new Button("按钮1"));
13 frame.add(new Button("按钮2"));
14
15 frame.pack();
16 frame.setVisible(true);
17 }
18 }

  在Swing中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout。大多数情况下,使用Box容器去容纳多个组件,然后再把Box容器最为一个组件添加到其他容器中形成完整的窗口布局。

方法名 说明
static Box createHorizontalBox() 创建一个水平排列组件的容器
static Box createVerticalBox() 创建一个垂直排列组件的容器
 1 import javax.swing.*;
2 import java.awt.*;
3
4 public class BoxLayout {
5 public static void main(String[] args) {
6 Frame frame = new Frame("BoxLayOut");
7
8 Box hbox = Box.createHorizontalBox();
9 Box vbox = Box.createVerticalBox();
10
11 hbox.add(new Button("1"));
12 hbox.add(new Button("2"));
13
14 vbox.add(new Button("3"));
15 vbox.add(new Button("4"));
16
17 frame.add(hbox,BorderLayout.NORTH);
18 frame.add(vbox,BorderLayout.SOUTH);
19
20 frame.pack();
21
22 frame.setVisible(true);
23 }
24 }

  我们发现,在这时生成的界面没有任何间隔,不是特别美观,因此可以在需要间隔的地方添加间隔组件。

方法名 说明
static Component createHorizontalGlue() 创建一条水平Glue(可在两个方向上同时拉伸的间距)
static Component createVerticalGlue() 创建一条垂直Glue(可在两个方向上同时拉伸的间距)
static Component createHorizontalStrut(int width) 创建一条指定宽度的水平Strut(可以在垂直方向上拉伸的间距)
static Component createVerticalStrut(int height) 创建一条指定高度的水平Strut(可以在水平方向上拉伸的间距)
 1 import javax.swing.*;
2 import java.awt.*;
3
4 public class BoxLayout {
5 public static void main(String[] args) {
6 Frame frame = new Frame("BoxLayOut");
7
8 Box hbox = Box.createHorizontalBox();
9 Box vbox = Box.createVerticalBox();
10
11 hbox.add(new Button("水平1"));
12 hbox.add(Box.createHorizontalGlue());
13 hbox.add(new Button("水平2"));
14
15 vbox.add(new Button("垂直1"));
16 vbox.add(Box.createVerticalGlue());
17 vbox.add(new Button("垂直2"));
18
19 frame.add(hbox,BorderLayout.NORTH);
20 frame.add(vbox,BorderLayout.SOUTH);
21
22 frame.pack();
23
24 frame.setVisible(true);
25 }
26 }

AWT03-LayoutManager布局管理器的更多相关文章

  1. Java——布局管理器

    在Swing中使用的所有布局管理器都可以实现LayoutManager接口,在Swing中主要使用的5种布局管理器:FlowLayout.BorderLayout.GridLayout.CardLay ...

  2. (转)Java 的swing.GroupLayout布局管理器的使用方法和实例

    摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...

  3. Java可视化编程,基于布局管理器的UI设计

    在<事件驱动模型>讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析UI各组件倒底该如何设计呈现. 优秀的UI会 ...

  4. Swing布局管理器

    在Swing中使用的所有布局管理器都可以实现LayoutManager接口.Swing中有五种常见的布局管理器分别为FlowLayout.BorderLayout.GridLayout.CardLay ...

  5. Java 的swing.GroupLayout布局管理器的使用方法和实例(转)

    The following builds a panel consisting of two labels in one column, followed by two textfields in t ...

  6. 【java】浅析java组件中的布局管理器

    这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...

  7. AWT和布局管理器

    AWT(Abstract Window Toolkit)抽象窗口开发包 component:可以显示出来的与用户进行交互的图形元素 container:容纳其他component元素的容器:conti ...

  8. Swing布局管理器介绍

    创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...

  9. java基础 布局管理器

    概念: 组建在容器(比如JFrame)中的位置和 大小 是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组建的布局管理. 种类: java共提供了物种布局管理器:流式布局管理 ...

随机推荐

  1. vue中父子间传值和非父子间传值

    vue传值一般分三种方式:父组件向子组件传值.子组件向父子间传值.非父子组件进行传值 一.父组件向子组件传值:父组件引用子组件后,通过数据绑定(v-bind)向子组件传值 父组件: <templ ...

  2. Mac太卡了怎么办?用CleanMyMac四招让它飞起来

    许多小伙伴使用Mac后都反馈电脑不如想象中的流畅,甚至有点卡顿的现象,原因可能是因为无用的应用占据了过多的内存,或者是系统盘垃圾过多,导致的电脑卡顿现象. 今天小编教给大家几招,让自己的Mac能够一键 ...

  3. Java基础教程——变量

    变量 变量(variable)可以理解为一个"有名称的容器",用于装各种不同类型的数据.编程人员通过对变量的访问和修改,操作内存中的数据. 对变量的理解:https://www.c ...

  4. 听说高手都用记事本写C语言代码?那你知道怎么编译运行吗?

    坊间传闻高手都喜欢用记事本写代码,那么问题来了,我们以C语言为例,如何用记事本编译运行呢?其实最简单的方式就是安装GCC编译器,在记事本编写C语言程序,然后再在命令行用GCC编译运行,下面我简单介绍一 ...

  5. 【震惊】手把手教你用python做绘图工具(一)

    在这篇博客里将为你介绍如何通过numpy和cv2进行结和去创建画布,包括空白画布.白色画布和彩色画布.创建画布是制作绘图工具的前提,有了画布我们就可以在画布上尽情的挥洒自己的艺术细胞. 还在为如何去绘 ...

  6. AA:白细胞计数

    总时间限制:  1000ms 内存限制:  65536kB 描述 医院采样了某临床病例治疗期间的白细胞数量样本n份,用于分析某种新抗生素对该病例的治疗效果.为了降低分析误差,要先从这n份样本中去除一个 ...

  7. 【数据结构】关于前缀树(单词查找树,Trie)

    前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...

  8. jdk1.8hashmap常见的面试问题

    1.HashMap原理,内部数据结构? 底层使用哈希表(数组加链表)来存储,链表过长会将链表转成红黑树,以实现在O(logn)时间复杂度内查找 2.讲一下HashMap中的put方法过程? 对key求 ...

  9. java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地

    最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...

  10. linux下iptables原理

    原文链接:https://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables ...