GUI 02:布局管理器相关知识,AWT 的 3 种布局管理器应用,以及嵌套布局的使用

一、前言

记录时间 [2024-05-31]

前置文章
GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口,Panel 面板,及监听事件的应用

本文讲述了 GUI 编程种布局管理器的相关知识,以及 AWT 的 3 种布局管理器——流式布局、边界布局(东西南北中)、网格布局。搭配面板使用,可以实现布局嵌套功能。


二、布局管理器

1. 相关概念

布局管理器,是 GUI 编程中的一个重要概念,它负责安排容器中组件的大小和位置。使用布局管理器可以使得 GUI 在不同的窗口大小、屏幕分辨率以及国际化的文本长度变化时,能够自适应地调整其布局,保持界面的整洁和一致性。

Java 提供了多种内置的布局管理器来满足不同场景的需求。下面是一些常用的布局管理器:

  • FlowLayout(流式布局):组件按照添加顺序从左到右排列,行满后换行。适合简单的菜单或按钮排列。
  • BorderLayout(边界布局):将容器划分为五个区域:北、南、东、西和中心。每个区域只能放置一个组件,常用于主窗口的基本布局。
  • GridLayout(网格布局):将容器分割成一个矩形网格,每个网格中放置一个组件。所有网格大小相等,适用于需要均匀分布组件的场景,如棋盘界面。
  • GridBagLayout(网格包布局):提供更复杂的网格布局功能,允许每个组件跨越多行或多列,以及设置组件的权重来控制空间分配。非常灵活,但配置也相对复杂。
  • BoxLayout(盒式布局):是 Swing 中提供的,它可以沿容器的一个轴(水平或垂直)排列组件,类似于流式布局,但提供了更精细的对齐和填充控制。
  • CardLayout(卡片布局):允许在同一个空间内堆叠多个组件(像卡片一样),但每次只有一个组件可见。常用于实现选项卡或向导式的界面。

2. 使用步骤

使用布局管理器的一般步骤包括:

  • 创建一个容器(如 Frame、Panel 等);
  • 为这个容器选择并设置一个合适的布局管理器;
  • 向容器中添加组件,并根据需要调整组件的约束条件(某些布局管理器需要);
  • 调整容器的大小或使用 pack() 方法让容器自动调整到最适合其内容的大小。

三、流式布局

1. 相关概念

在 Java 的 AWT(Abstract Window Toolkit,抽象窗口工具包)中,流式布局(FlowLayout)是一种布局管理器,它按照组件添加到容器的顺序从左到右排列组件。当一行排满时,后续的组件会自动换行到下一行继续排列。流式布局非常适合于创建菜单、按钮栏等简单界面元素的布局。

流式布局的主要特点包括:

  • 组件顺序:组件按照添加到容器的顺序依次排列。
  • 对齐方式:默认情况下,组件在每一行中居左对齐,但可以通过构造函数指定居中对齐 FlowLayout.CENTER 或居右对齐 FlowLayout.RIGHT
  • 水平和垂直间隙:可以设置组件之间的水平和垂直间隙,以调整布局的紧凑度或宽松度。
  • 自动换行:一行排满后自动换到下一行显示,无需手动处理换行逻辑。

2. 案例分析

编写代码

例如,将 3 个按钮按照流式布局添加到窗口中。

public class TestFlowLayout {public static void main(String[] args) {Frame frame = new Frame("TestFlowLayout");// 组件 - 按钮Button button1 = new Button("button1");Button button2 = new Button("button2");Button button3 = new Button("button3");// 设置为流式布局frame.setLayout(new FlowLayout());frame.setSize(400, 400);// 把按钮添加上去frame.add(button1);frame.add(button2);frame.add(button3);frame.setVisible(true);}
}

效果查看

三个按钮在窗口中的位置如图所示,流式布局默认是居中的

在这里插入图片描述


居左居右

流式布局默认是居中的,当然也可以实现居左居右。

// 流式布局默认居中
frame.setLayout(new FlowLayout());// 设置靠左
frame.setLayout(new FlowLayout(FlowLayout.LEFT));// 设置靠右
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));

四、边界布局

1. 相关概念

边界布局(BorderLayout)将容器划分为五个区域:北(North)、南(South)、东(East)、西(West)和中心(Center)。每个区域可以放置一个组件,这样的设计非常适合创建具有标准框架结构的窗口,比如带有菜单栏、工具栏、状态栏和主要内容区域的窗口布局。

边界布局的特点包括:

  • 五个区域:每个区域都有特定的含义和默认的行为。中心区域通常占据最大的空间,而北、南、东、西区域则作为边缘区域,通常放置辅助性的控件如按钮、标签等。
    • North:位于容器顶部,通常用于放置标题栏、菜单栏等。
    • South:位于容器底部,常用于放置状态栏、确认/取消按钮等。
    • East:位于容器右侧,适合放置侧边栏或较小的控制面板。
    • West:位于容器左侧,用途与东区相似,也是放置辅助控件的好位置。
    • Center:占据容器剩余的所有空间,主要用于放置主要的内容或控件。
  • 组件大小:除了中心区域会填充剩余空间外,其他区域的大小默认为所包含组件的最佳大小,但也可以通过设置组件的首选大小来影响它们的尺寸。
  • 单一组件:边界布局的每个区域只能放置一个组件。如果需要在同一区域内放置多个组件,应该先将这些组件放入一个容器(如Panel),再将该容器添加到相应的区域。

2. 案例分析

编写代码

例如,在东西南北中 5 个位置分别添加一个按钮。

public class TestBorderLayout {public static void main(String[] args) {Frame frame = new Frame("TestBorderLayout");Button east = new Button("East");Button west = new Button("West");Button south = new Button("South");Button north = new Button("North");Button center = new Button("Center");// 添加到布局中frame.add(east, BorderLayout.EAST);frame.add(west, BorderLayout.WEST);frame.add(south, BorderLayout.SOUTH);frame.add(north, BorderLayout.NORTH);frame.add(center, BorderLayout.CENTER);frame.setSize(400, 400);frame.setVisible(true);}
}

效果查看

窗口效果如图所示,呈现出东西南北中的架构。

在这里插入图片描述


五、网格布局

1. 相关概念

网格布局(GridLayout)将容器划分为一个二维的网格结构,每个网格中可以放置一个组件。组件在网格中均匀分布,每个网格的大小相同,由其中最大的组件决定。

网格布局适用于需要将界面元素组织成规则矩阵的情况,如计算器、棋盘或表格布局等。

使用网格布局的特点包括:

  • 行列数量:在创建 GridLayout 时,可以指定行数和列数,或者只指定一个参数。
    • new GridLayout(3, 2) 表示 3 行 2 列;
    • new GridLayout(2) 表示 2 行,每行的列数由添加的组件自动决定。
  • 组件大小:所有网格的大小一致,自动调整以适应容器的大小,且所有组件在网格中大小相等。这意味着较大的组件可能会挤压其他组件的空间。
  • 填充顺序:组件按照添加到容器的顺序填充网格,从左到右,从上到下
  • 空白空间:网格布局不考虑组件间的空白空间,所有组件紧密相邻。

2. 案例分析

编写代码

例如,设置一个 3 行 2 列的网格,分别在每个网格中放置一个按钮。

使用 pack() 方法让容器自动调整到最适合其内容的大小。

public class TestGridLayout {public static void main(String[] args) {Frame frame = new Frame("TestGridLayout");Button btn1 = new Button("btn1");Button btn2 = new Button("btn2");Button btn3 = new Button("btn3");Button btn4 = new Button("btn4");Button btn5 = new Button("btn5");Button btn6 = new Button("btn6");frame.setLayout(new GridLayout(3, 2));frame.add(btn1);frame.add(btn2);frame.add(btn3);frame.add(btn4);frame.add(btn5);frame.add(btn6);// java 函数,网格自适应窗口布局frame.pack();frame.setVisible(true);}
}

效果查看

窗口效果如图所示,六个按钮按从左到右,从上到下的次序添加到窗口中。

在这里插入图片描述


六、综合案例

1. 案例要求

接下来完成嵌套布局案例,具体要求如下:

  • 将按钮摆放成如图所示模样;
  • 设置关闭按钮监听事件。

在这里插入图片描述


2. 案例分析

  • 对上述布局进行大致划分,首先可以上下结构——2 行 1 列的网格布局(p1 和 p3);
  • p1 设置为边界布局(东西南北中)布局,中间嵌入 p2,p2 为 2 行 1 列的网格布局;
  • p3 设置为边界布局(东西南北中)布局,中间嵌入 p4,p4 为 2 行 2 列的网格布局。

在这里插入图片描述


3. 代码实现

设置顶层窗口

设置顶层 Frame 窗口的一系列参数:可见性、宽高、初始位置、背景颜色,以及布局。

// 总 Frame
Frame frame = new Frame("布局嵌套");
frame.setSize(400, 300);         // 设置宽高
frame.setLocation(300, 400);            // 设置初始位置
frame.setBackground(Color.blue);             // 设置背景颜色
frame.setVisible(true);                      // 设置可见
frame.setLayout(new GridLayout(2, 1));  // 设置网格布局

设置 4 个面板

设置 4 个面板 Panel,以完成布局的嵌套。

// 4 个面板
Panel p1 = new Panel(new BorderLayout());       // 边界布局(东西南北中)布局
Panel p2 = new Panel(new GridLayout(2, 1));
Panel p3 = new Panel(new BorderLayout());
Panel p4 = new Panel(new GridLayout(2, 2));// p1 p3 添加到主窗口
frame.add(p1);
frame.add(p3);

完成上半部分

上半部分 p1 设置为边界布局(东西南北中)布局,中间嵌入 p2,p2 为 2 行 1 列的网格布局。

把 p2 添加到 p1 中。

// 上半部分
p1.add(new Button("East-1"), BorderLayout.EAST);
p1.add(new Button("West-1"), BorderLayout.WEST);
p2.add(new Button("p2-btn-1"));
p2.add(new Button("p2-btn-2"));
p1.add(p2, BorderLayout.CENTER);    // 把 p2 添加到 p1 中

完成下半部分

下半部分 p3 设置为边界布局(东西南北中)布局,中间嵌入 p4,p2 为 2 行 2 列的网格布局。

把 p4 添加到 p3 中。

// 下半部分
p3.add(new Button("East-2"), BorderLayout.EAST);
p3.add(new Button("West-2"), BorderLayout.WEST);
for (int i = 0; i < 4; i++) {p4.add(new Button("for" + i));
}
p3.add(p4, BorderLayout.CENTER);    // 把 p4 添加到 p3 中

设置按钮监听

设置关闭按钮监听——点击关闭按钮时,关闭窗口。

// 设置按钮监听
frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}
});

七、总结

本文讲述了 GUI 编程种布局管理器的相关知识,以及 AWT 的 3 种布局管理器——流式布局、边界布局(东西南北中)、网格布局。搭配面板使用,可以实现布局嵌套功能。


要点整理

  • Frame 是顶层窗口;
  • Panel 无法单独显示,必须添加到某个容器中;
  • 3 种布局管理器:流式布局、边界布局(东西南北中)、网格布局;
  • 参数:大小、定位、布局、背景颜色、可见性、监听。

一些参考资料

狂神说 GUI 编程:https://www.bilibili.com/video/BV1DJ411B75F
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…

P3881

最小值最大 二分&#xff1a;枚举两个牛之间的最小距离&#xff0c;左端点是1&#xff0c;右端点是篱笆总长度。 Check数组&#xff1a; 如果两头牛之间距离是Mid不合法&#xff0c;则返回0&#xff08;false&#xff09;&#xff1b; 如果两头牛之间距离是Mid合法&#xf…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型&#xff08;DDPMs&#xff09;是一种先进的生成模型&#xff0c;它通过模拟数据的噪声化和去噪过程&#xff0c;展现出多方面的优势。DDPMs能够生成高质量的数据样本&#xff0c;这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…

瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发

一、完善登录功能 1.1 问题分析 1.2 代码实现 package com.itheima.reggie.filter;//这是一个过滤器类 //登录检查过滤器import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf…

HarmonyOS鸿蒙学习笔记(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的关系Component生命周期Entry生命周期 生命周期流程图生命周期展示示例代码参考资料 HarmonyOS的生命周期可以分为Compnent的生命周期和Entry的生命周期&#xff0c;也就是自定义组件的生命周期和页面的生命周期。 entry和Compone…

【传知代码】双深度学习模型实现结直肠癌检测(论文复现)

前言&#xff1a;在医学领域&#xff0c;科技的进步一直是改变人类生活的关键驱动力之一。随着深度学习技术的不断发展&#xff0c;其在医学影像诊断领域的应用正日益受到关注。结直肠癌是一种常见但危害极大的恶性肿瘤&#xff0c;在早期发现和及时治疗方面具有重要意义。然而…

快手发布大模型产品“可图”,超20种创新AI图像玩法限免上线

近日&#xff0c;快手自研大模型产品“可图”&#xff08;Kolors&#xff09;正式对外开放&#xff0c;支持文生图和图生图两类功能&#xff0c;已上线20余种AI图像玩法。目前&#xff0c;用户可以通过“可图大模型”官方网站和微信小程序&#xff0c;免费使用各项AI图像功能。…

纯分享#126个电商平台集合(包含60个不同国家)值得一看

01 亚洲 中国 淘宝&#xff1a;拥有大量的卖家和商品种类&#xff0c;主要面向中国市场。天猫:淘宝旗下的B2C电商平台&#xff0c;提供品质保证、正品保障的商品。京东:中国第二大B2C电商平台&#xff0c;提供品质保证、正品保障的商品。苏宁易购: 中国家电连锁巨头苏宁旗下的…

反VC情绪:加密市场需要新的分布式代币发行方式

GME事件 GME事件反应了社交媒体在金融决策中的影响力&#xff0c;散户投资者群体通过集体行动&#xff0c;改变了很多人对股市的看法和参与方式。 GME事件中&#xff0c;meme扮演了核心角色。散户投资者使用各种meme来沟通策略、激励持股行为&#xff0c;创造了一种反对华尔街…

【车载开发系列】汽车开发常用工具说明

【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明一. CANbedded二. Davinci Configurator Pro三. Davinci Developer-AUTOSAR软件组件设计工具四. MICROSAR五. MICROSAR OS六. CANdelaStudio七. Volcano VSB八…

Mysql基础教程(11):DISTINCT

MySQL DISTINCT 用法和实例 当使用 SELECT 查询数据时&#xff0c;我们可能会得到一些重复的行。比如学生表中有很多重复的年龄。如果想得到一个唯一的、没有重复记录的结果集&#xff0c;就需要用到 DISTINCT 关键字。 MySQL DISTINCT用法 在 SELECT 语句中使用 DISTINCT 关…

Spring Boot 项目中使用 JSP

文章目录 Spring Boot 项目中使用 JSP项目结构引入依赖包编写页面和后台运行方式一&#xff1a;Maven 命令运行方式二&#xff1a;在 IDEA 中运行方式三&#xff1a;打 war 包部署运行 Spring Boot 项目中使用 JSP 在 Spring Boot 项目中不是不可以使用 JSP 。想在 Spring Boo…

【React】封装一个好用方便的消息框(Hooks Bootstrap 实践)

引言 以 Bootstrap 为例&#xff0c;使用模态框编写一个简单的消息框&#xff1a; import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录 1. 前言2. memmove()函数2.1 memmove()函数与memcpy()函数的差异2.2 memmove()函数的原型2.3 memmove()函数的使用案例 3. memmove()函数的模拟实现4. 总结 1. 前言 在之前&#xff0c;我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话&#…

12k Star!Continue:Github Copilot 开源本地版、开发效率和隐私保护兼得、丰富功能、LLM全覆盖!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 12k Star&#xff01;Continue&#xff1a;Github Copilot 开源本地版、开发效率和隐私保护兼得、丰富功能、LLM全覆盖&#xff01; &…

Beamer中二阶导、一阶导数的显示问题

Beamer中二阶导、一阶导数的显示问题 在beamer中表示 f ′ f f′和 f ′ ′ f f′′时发现导数符号距离 f f f很近 \documentclass{beamer} \usepackage{amsmath,amssymb}\begin{document} \begin{frame}\frametitle{Derivative}Derivative:\[f^{\prime}(x) \quad f \quad…

conda与pip的镜像源与代理设置

conda与pip的镜像源与代理设置 一、前言二、conda镜像源设置2.1conda默认镜像源介绍2.2通过终端设置镜像源2.3通过配置文件设置镜像源 三、pip镜像源设置3.1pip默认镜像源介绍3.2通过终端临时设置镜像源3.3通过配置文件设置一个或多个镜像源 四、conda代理设置4.1通过终端设置代…

数据结构与算法笔记:基础篇 - 栈:如何实现浏览器的前进和后退功能?

概述 浏览器的前进、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 当依次访问完一串页面 a-b-c 之后&#xff0c;点击浏览器的后退按钮&#xff0c;就可以查看之前浏览过的页面 b 和 a。当后退到页面 a&#xff0c;点击前进按钮&#xff0c;就可以重新查看页面 b 和 c。但…

放开了去的 ulimit

放开了去的 ulimit 放开了去的 ulimitulimit简介临时修改打开文件数目永久修改系统总打开句柄限制更多信息 放开了去的 ulimit ulimit简介 对于高并发或者频繁读写文件的应用程序而言&#xff0c;有时可能需要修改系统能够打开的最多文件句柄数&#xff0c;否则就可能会出现t…

HTTPS 原理技术

HTTPS原理技术 背景简介原理总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全原创&am…