AWT03-LayoutManager布局管理器
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布局管理器的更多相关文章
- Java——布局管理器
在Swing中使用的所有布局管理器都可以实现LayoutManager接口,在Swing中主要使用的5种布局管理器:FlowLayout.BorderLayout.GridLayout.CardLay ...
- (转)Java 的swing.GroupLayout布局管理器的使用方法和实例
摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...
- Java可视化编程,基于布局管理器的UI设计
在<事件驱动模型>讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析UI各组件倒底该如何设计呈现. 优秀的UI会 ...
- Swing布局管理器
在Swing中使用的所有布局管理器都可以实现LayoutManager接口.Swing中有五种常见的布局管理器分别为FlowLayout.BorderLayout.GridLayout.CardLay ...
- Java 的swing.GroupLayout布局管理器的使用方法和实例(转)
The following builds a panel consisting of two labels in one column, followed by two textfields in t ...
- 【java】浅析java组件中的布局管理器
这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...
- AWT和布局管理器
AWT(Abstract Window Toolkit)抽象窗口开发包 component:可以显示出来的与用户进行交互的图形元素 container:容纳其他component元素的容器:conti ...
- Swing布局管理器介绍
创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...
- java基础 布局管理器
概念: 组建在容器(比如JFrame)中的位置和 大小 是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组建的布局管理. 种类: java共提供了物种布局管理器:流式布局管理 ...
随机推荐
- Springboot 框架整理,建议做开发的都看看,整理的比较详细!
什么是 Spring Boot? SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品,是用来简化 spring 初始搭建和开 ...
- 直面秋招!非科班生背水一战,最终拿下阿里等大厂offer!
前言 2020年已经接近到9月份了,很多粉丝朋友都对金九银十雀雀欲试了吧!也有很多朋友向我求教经验,因为我自己工作相对于稳定,在这里给大家分享一个粉丝朋友的经历,他作为一个曾经的菜鸡面试者,在不断的失 ...
- Ayoa:麻雀虽小、五脏俱全的思维导图工具
Ayoa是一款简单好用的思维导图软件,在PC端可以使用Ayoa网页版,也就是不用下载即可使用,十分轻便省力.但麻雀虽小,五脏可十分俱全,同类的其他大型软件有的东西它可一点不少,甚至还有更多的特殊功能. ...
- iOS gif图显示问题
问题 有时候需要显示gif动态图,让界面更加的绚丽,但是iOS默认只支持png,gpg图片.那么如何才能显示gif图呢? 解决方式 添加框架 CoreGraphics.framework ImageI ...
- 【CF620E】New Year Tree
(题面来自luogu) 题意翻译 你有一棵以1为根的有根树,有n个点,每个节点初始有一个颜色c[i]. 有两种操作: 1 v c 将以v为根的子树中所有点颜色更改为c 2 v 查询以v为根的子树中的节 ...
- 一张图彻底理解Spring如何解决循环依赖!!
写在前面 最近,在看Spring源码,看到Spring解决循环依赖问题的源码时,不得不说,源码写的太烂了.像Spring这种顶级的项目源码,竟然存在着这种xxx的代码.看了几次都有点头大,相信很多小伙 ...
- java基础之一:基本数据类型
在java中有基本数据类型和引用类型两种,今天来说下基本数据类型和其对应的包装类的之间的关系. 一.概述 java中的基本数据类型有八种,分别是char.byte.short.int.long.flo ...
- 交换机三种端口模式Access、Hybrid和Trunk
以太网端口有 3种链路类型:access.trunk.hybird 什么是链路类型? vlan的链路类型可以分为接入链路和干道链路. 1.接入链路(access link)指的交换机到用户设备的链路, ...
- 六. Vue CLI详解
1. Vue CLI理解 1.1 什么是Vue CLI 如果你只是简单写几个Vue的Demo程序, 那么你不需要Vue CLI,如果你在开发大型项目那么你需要它, 并且必然需要使用Vue CLI. 使 ...
- 第一次UML作业
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...