JavaGUI - [03] LayoutManager布局管理器
Component中有一个方法setBounds()可以设置当前容器的位置和大小,但如果我们手动为组件设置位置和大小的话,就会造成程序的不通用性。LayoutManager布局管理器可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置,只需要为容器选择合适的布局管理器即可。
一、布局管理器的种类
LayoutManager >GridLayout:网格布局管理器
LayoutManager >FlowLayout:流式布局管理器
LayoutManager2>CardLayout:卡片布局管理器
LayoutManager >GridBagLayout:网格包布局管理器
LayoutManager >BorderLayout:边框布局管理器(默认布局)
二、FlowLayout
在FlowLayout布局管理器中,组件像流水一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列。通俗的讲就像是:自动换行。
FlowLayout()
使用默认的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器。
FlowLayout(int align)
使用指定的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器。
FlowLayout(int align,int hgap,int vgap)
使用指定的对齐方式及指定的垂直间距、水平间距创建FlowLayout布局管理器。
2.1、FlowLayoutDemo
package com.harley.layout;
import javax.swing.*;
import java.awt.*;
/**
* @author harley
* @date 2024/05/06 12:19
*/
public class s04_FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("FlowLayoutDemo");
// 1. 指定局部方式
frame.setLayout(new FlowLayout());
// 2. 添加组件到frame中
for(int i = 1;i <= 100;i++){
frame.add(new JButton("按钮"+i));
}
// 3. 设置最佳大小,pack方法
frame.pack();
// 4. 设置window可见
frame.setVisible(true);
}
}
效果如下

左对齐:frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));

居中对齐:frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,20));

右对齐:frame.setLayout(new FlowLayout(FlowLayout.RIGHT,20,20));

三、BorderLayout(默认布局)
BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,普通组件可以被放置在这5个区域的任意一个中。BorderLayout布局管理器的布局示意图如图所示。

当改变使用BorderLayout的容器的大小时,NORTH、SOUTH和CENTER区域水平调整,而EAST、WEST和CENTER区域垂直调整。使用BorderLayout有如下两个注意点。
1、当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域中,如果没有指定添加到哪个区域中,则默认添加到中间区域中;
2、如果向同一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。
构造方法有如下:
BorderLayout():使用默认的水平间距、垂直间距创建BorderLayout布局管理器。
BorderLayout(int hgap,int vgap):使用指定的水平间距、垂直间距创建BorderLayout布局管理器。
五神兽阵法
package com.harley.layout;
import java.awt.*;
/**
* @author harley
* @date 2024/05/06 13:34
*/
public class s05_BorderLayoutDemo1 {
public static void main(String[] args) {
// 1. 创建window窗口对象
Frame frame = new Frame("BorderLayoutDemo1");
// 2. 设置布局管理器为BorderLayout
frame.setLayout(new BorderLayout(30,10));
// 3. 向frame中添加组件
frame.add(new Button("青龙"),BorderLayout.EAST);
frame.add(new Button("朱雀"),BorderLayout.SOUTH);
frame.add(new Button("白虎"),BorderLayout.WEST);
frame.add(new Button("玄武"),BorderLayout.NORTH);
frame.add(new Button("麒麟"),BorderLayout.CENTER);
// 4. 设置自动大小
frame.pack();
// 5. 设置窗口可见
frame.setVisible(true);
}
}
效果如下

如果西侧/东侧不放置组件,则会被中间组件占用掉。
如果西侧和东侧都不放置,则中间组件独占。
如果北侧/南侧不放置组件,则会被东侧、西侧以及中间的组件占用掉。
如果北侧和南侧都不放置,则会被东侧、西侧以及中间的组件占用掉。
如果中间不放置组件,中间区域并不会被占用。
四、GridLayout
GridLayout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相同。当向使用GridLayout布局管理器的容器中添加组件时,默认从左向右、从上向下依次添加每个网格中。与FlowLayout不同的是,放置在GridLayout布局管理器中的各个组件的大小由组件所处的区域决定(每个组件将自动占满整个区域)。
GridLayout(int rows,int cols)
采用指定的行数、列数,以及默认的横向间距、纵向间距将容器分割成多个网格。
GridLayout(int rows,int cols,int hgap,int vgap)
采用指定的行数、列数,以及指定的横向间距、纵向间距将容器分割成多个网格。
计算器
效果

代码
package com.harley.layout;
import java.awt.*;
/**
* @author harley
* @date 2024/05/06 13:56
*/
public class s06_GridLayoutDemo {
public static void main(String[] args) {
// 1. 创建window窗口对象
Frame frame = new Frame("FlowLayoutDemo");
// 2. 创建Panel对象,存放一个TextField组件
Panel panel = new Panel();
panel.add(new TextField(30));
// 3. 把Panel放到frame的北边区域,默认是BorderLayout布局
frame.add(panel,BorderLayout.NORTH);
// 4. 创建一个Panel2对象,并且设置它的布局管理器为GridLayout
Panel panel2 = new Panel();
panel2.setLayout(new GridLayout(3,5,4,4));
// 5. 向Panel2中添加内容
for (int i = 0; i < 10; i++) {
panel2.add(new Button(i+""));
}
panel2.add(new Button("+"));
panel2.add(new Button("-"));
panel2.add(new Button("*"));
panel2.add(new Button("/"));
panel2.add(new Button("."));
// 6. 把panel2添加到frame中
frame.add(panel2);
// 7. 设置最佳大小,pack方法
frame.pack();
// 8. 设置window可见
frame.setVisible(true);
}
}
五、GridBagLayout
GridBagLayout布局管理器的功能最强大,但也最复杂,与GridLayout布局管理器不同的是,在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理器也可以准确地控制窗口各部分的拉伸。
由于在GridBagLayout布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。
代码略
六、CardLayout
CardLayout布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个Component才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见。
CardLayout():创建默认的CardLayout布局管理器
CardLayout(int hgap,int vgap)
通过指定卡片与容器左右边界的间距(C hgap)、上下边界(Cvgap)的间距来创建CardLayout布局管理器
first(Container target):显示target容器中的第一张卡片
last(Container target):显示target容器中的最后一张卡片
previous(Container target):显示target容器中的前一张卡片
next(Container target):显示target容器中的后一张卡片
show(Container target,String name):显示target容器中指定名字的卡片
效果

代码
package com.harley.layout;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author harley
* @date 2024/05/06 14:33
*/
public class s08_CardLayoutDemo {
public static void main(String[] args) {
// 1. 创建window窗口对象
Frame frame = new Frame("CardLayoutDemo");
// 2. 创建一个Panel用来存储多张卡片
final Panel panel = new Panel();
// 3. 创建CardLayout对象,并且把该对象设置给之前创建容器panel
final CardLayout cardLayout = new CardLayout();
panel.setLayout(cardLayout);
// 4. 向Panel中存储多个组件
String[] names = {"第一张","第二张","第三张","第四张","第五张","第六张"};
for (int i = 0; i < names.length; i++) {
panel.add(names[i],new Button(names[i]));
}
// 5. 将panel放入frame的中间区域
frame.add(panel,BorderLayout.CENTER);
// 6. 创建另外一个Panel,存储多个按钮组件
final Panel panel2 = new Panel();
// 7. 创建5个按钮组件
Button button1 = new Button("上一张");
Button button2 = new Button("下一张");
Button button3 = new Button("第一张");
Button button4 = new Button("最后一张");
Button button5 = new Button("第三张");
// 8. 创建一个事件监听器,监听按钮的点击动作
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
switch (actionCommand){
case "上一张":
cardLayout.previous(panel);
break;
case "下一张":
cardLayout.next(panel);
break;
case "第一张":
cardLayout.first(panel);
break;
case "最后一张":
cardLayout.last(panel);
break;
case "第三张":
cardLayout.show(panel,"第三张");
break;
default:
cardLayout.first(panel);
break;
}
}
};
// 9. 把当前这个事件监听器和多个按钮绑定到一起
button1.addActionListener(listener);
button2.addActionListener(listener);
button3.addActionListener(listener);
button4.addActionListener(listener);
button5.addActionListener(listener);
// 10. 把按钮添加到panel中
panel2.add(button1);
panel2.add(button2);
panel2.add(button3);
panel2.add(button4);
panel2.add(button5);
// 11. 将panel2添加到frame的南侧
frame.add(panel2,BorderLayout.SOUTH);
// 12. 设置自动大小
frame.pack();
// 13. 设置窗口可见
frame.setVisible(true);
}
}
— 要养成终身学习的习惯 —
JavaGUI - [03] LayoutManager布局管理器的更多相关文章
- Java Swing 第03记 布局管理器
几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...
- JavaGUI三种布局管理器FlowLayout,BorderLayout,GridLayout的使用
三种布局管理器 流式布局FlowLayout package GUI; import java.awt.*; import java.awt.event.WindowAdapter; import j ...
- AWT03-LayoutManager布局管理器
1.LayoutManager布局管理器 在之前的学习中,我们使用setBounds()方法设置容器的位置大小,但我们不得不明白一件事--如果我们手动为容器设置位置大小的话,就会造成程序通用性的下降. ...
- 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 ...
随机推荐
- vue keep-alive include无效
1. 检查版本 include和exclude是vue2.1.0新增的两个属性 2. 检查需要缓存的每个组件中的name属性 router.js 中的name和vue组件的name保持一致,不要混乱 ...
- OpenID Connect 验证
OpenID Connect Authentication 几乎所有的 Web 应用程序都提示用户创建账号并登录.为了创建账号,用户被要求提供他们的名字.电子邮件.口令.以及确认口令.不仅这些需要耗费 ...
- Qt/C++动态启用地图功能/地图拖曳/键盘操作/滚轮缩放/双击放大/连续缩放等
一.前言说明 地图组件为了方便用户的操作,一般会满足各种需求场景,比如用鼠标拖曳地图,实体键盘按键上下左右移动,鼠标滚轮缩放地图大小,双击放大地图,这些常规的操作可以极大的方便用户操作,问题是,有时候 ...
- Qt编写安防视频监控系统19-日志查询
一.前言 日志查询功能是基础功能,主要分两块,一个是本地日志查询,包括运行日志.报警日志.操作日志:一个是设备日志查询,就是通过SDK去拉去NVR设备的日志信息,包括系统操作.配置操作.报警操作.录像 ...
- Qt通用方法及类库2
函数名 //初始化数据库 static void initDb(const QString &dbName); //初始化文件,不存在则拷贝 static void initFile(cons ...
- IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点
本文由vivo技术团队Li Guanyun分享,为了提升阅读体验,进行了较多修订和重新排版. 1.引言 Protobuf 作为一种跨平台.语言无关.可扩展的序列化结构数据通讯协议,已广泛应用于网络数据 ...
- 深入Python胶水语言的本质:从CPython到各类扩展机制
在开始深入讲解Python如何作为胶水语言之前,我们需要先了解Python语言本身的实现机制.这对于理解Python如何与C语言交互至关重要. CPython:Python的默认实现 当我们谈论Pyt ...
- Solution Set -「NOIP Simu.」20221005
\(\mathscr{A}\sim\)「CF 1252G」Performance Review Link & Submission. Tag:「水题无 tag」 记 \(A=a_1 ...
- 记一次 contentInsetAdjustmentBehavior 引发的bug
注:本文同步发布于微信公众号:stringwu的互联网杂谈记一次 contentInsetAdjustmentBehavior 引发的bug 1 背景 项目中使用到了UILable来展示相关的文本内容 ...
- runoob-scala
https://www.runoob.com/scala/scala-tutorial.html Scala 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成 ...
