热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

JavaSwingGridBagLayout网格袋布局的实现

这篇文章主要介绍了JavaSwingGridBagLayout网格袋布局的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 布局: GridBagLayout

官方JavaDocsApi: java.awt.GridBagLayout

GridBagLayout,网格袋布局管理器。它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个 GridBagLayout 对象维持一个动态的矩形单元格(动态计算出单个单元格的大小),每个组件占用一个或多个的单元格,该单元格被称为 显示区域。每个组件显示区域按 从左到右,从上到下,依次排列。

2. 约束: GridBagConstraints

GridBagConstraints,封装了若干对组件的约束属性,每个由 GridBagLayout 管理的 组件都关联一个该约束实例,以指定 组件所在显示区域 的具体放置位置,以及 组件在其显示区域中 的对齐方式。

给组件添加约束: GridBagLayout.setConstraints(Component comp, GridBagConstraints c)

PS: 要理解 组件(所在)显示区域(一个或多个单元格组成) 和 组件在其显示区域中的对齐方式 这两个不同的概念。

3. 属性: GridBagConstraints 的属性

下面属性描述中的相关大写字母常量均定义在GridBagConstraints类中。

3.1 显示区域 约束属性

组件的显示区域相关约束属性,直接作用在组件所在显示区域上。

(1)gridx, gridy

组件显示区域 开始显示的位置(单元格坐标),容器左上角第一个单元格位置为 (0, 0),默认值为RELATIVE,表示放置在 “上一个组件”(所在行列最后添加的一个组件)的 “后面”。

(2)gridwidth, gridheight

组件显示区域 水平/竖直方向 所占单元格的个数,默认值为 1,如要占多行/列,需整体结果有足够的行/列。有如下两个常量特殊值可选:

  • REMAINDER: 占完所在行/列余下所有单元格(该值可实现 换行 作用);
  • RELATIVE: 占到所在行/列余下的倒数第二个单元格(使用该值,所在行/列的最后一个单元格需要“合理”安排组件,并手动换行)。

设置该值不能导致 “前面” 或 “后面” 单元格有留空白,否则可能无效。

(3)weightx, weighty

如何 分布额外空间(单元格区域外,容器边缘内 的间隔),当指定行/列中的其中 任意一个 组件的权重(大于0),则该行/列将(和其他行/列按权重比例)分配额外的水平/竖直空间。当权重为 0(默认值)时,则 整个单元格区域 居中于容器中心。

PS: 如果调用了java.awt.Window.pack()方法,该值无效,因为 pack 后已无额外的空间。

3.2 组件 约束属性

组件相关约束属性,直接作用在组件上。

(1)fill

当 显示区域 大小大于 组件 所需要的大小时,组件 在其 显示区域内 的填充方式。可能的值如下:

  • NONE: (默认)不调整组件大小;
  • HORIZONTAL: 加宽组件,使它在水平方向上填满其显示区域,但是不改变高度;
  • VERTICAL: 加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度;
  • BOTH: 使组件完全填满其显示区域。

(2)anchor

组件 在 显示区域内 的位置(对齐方式),可能有如下三种值:

绝对值 相对于方向的值 相对于基线的值
NORTH PAGE_START BASELINE
SOUTH PAGE_END BASELINE_LEADING
WEST LINE_START BASELINE_TRAILING
EAST LINE_END ABOVE_BASELINE
NORTHWEST FIRST_LINE_START ABOVE_BASELINE_LEADING
NORTHEAST FIRST_LINE_END ABOVE_BASELINE_TRAILING
SOUTHWEST LAST_LINE_START BELOW_BASELINE
SOUTHEAST LAST_LINE_END BELOW_BASELINE_LEADING
CENTER(默认值) BELOW_BASELINE_TRAILING

(3)ipadx, ipady

组件的内部填充(可看做是 组件的内边距),即对组件最小大小的添加量。组件的宽度至少为其最小宽度/高度加上 ipadx/ipady 像素。

(4)insets

组件的外部填充(可看做是 组件的外边距,也可看做是 显示区域 的内边距),即 组件 与其 显示区域边缘 之间间距的最小量。

PS: 上面各属性值之间,以及其他因素,有可能存在冲突或不兼容,不一定设置了即有效,建议多做实验,多写测试Demo去尝试。

4. 案例: GridBagLayout使用实例

先展示效果,如下图所示:

各按钮约束参数:

  • Button01, Button02, Button03:默认
  • Button04:gridwidth = REMAINDER、fill = BOTH
  • Button05:gridwidth = REMAINDER、fill = BOTH
  • Button06:gridwidth = RELATIVE、fill = BOTH
  • Button07:gridwidth = REMAINDER
  • Button08:gridheight = 2、fill = BOTH
  • Button09:gridwidth = REMAINDER、fill = BOTH
  • Button10:gridwidth = REMAINDER、fill = BOTH

代码实现:

package com.xiets.swing;

import javax.swing.*;
import java.awt.*;

public class Main {

 public static void main(String[] args) {
  JFrame jf = new JFrame("测试窗口");
  jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  GridBagLayout gridBag = new GridBagLayout(); // 布局管理器
  GridBagConstraints c = null;     // 约束

  JPanel panel = new JPanel(gridBag);

  JButton btn01 = new JButton("Button01");
  JButton btn02 = new JButton("Button02");
  JButton btn03 = new JButton("Button03");
  JButton btn04 = new JButton("Button04");
  JButton btn05 = new JButton("Button05");
  JButton btn06 = new JButton("Button06");
  JButton btn07 = new JButton("Button07");
  JButton btn08 = new JButton("Button08");
  JButton btn09 = new JButton("Button09");
  JButton btn10 = new JButton("Button10");

  /* 添加 组件 和 约束 到 布局管理器 */
  // Button01
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn01, c); // 内部使用的仅是 c 的副本

  // Button02
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn02, c);

  // Button03
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn03, c);

  // Button04 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn04, c);

  // Button05 显示区域独占一行(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn05, c);

  // Button06 显示区域占到当前尾倒车第二个单元格(下一个组件后需要手动换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.RELATIVE;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn06, c);

  // Button07 放置在当前行最后一个单元格(换行)
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  gridBag.addLayoutComponent(btn07, c);

  // Button08 显示区域占两列,组件填充显示区域
  c = new GridBagConstraints();
  c.gridheight = 2;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn08, c);

  // Button09 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn09, c);

  // Button10 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn10, c);

  /* 添加 组件 到 内容面板 */
  panel.add(btn01);
  panel.add(btn02);
  panel.add(btn03);
  panel.add(btn04);
  panel.add(btn05);
  panel.add(btn06);
  panel.add(btn07);
  panel.add(btn08);
  panel.add(btn09);
  panel.add(btn10);

  jf.setContentPane(panel);
  jf.pack();
  jf.setLocationRelativeTo(null);
  jf.setVisible(true);
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 苹果新专利或将引领无边框手机时代
    苹果公司最近公布了一项新的专利技术,该技术能够在设备屏幕中嵌入光线传感器,这标志着苹果在实现无边框手机设计上迈出了重要一步。这一创新将极大提升手机的屏占比,并可能为未来的iPhone带来革命性的变化。 ... [详细]
  • 本文探讨了在UC浏览器中调用分享面板后,图片无法正常显示的问题,并提供了详细的解决方法和代码示例。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 本文旨在提供一套高效的面试方法,帮助企业在短时间内找到合适的产品经理。虽然观点较为直接,但其方法已被实践证明有效,尤其适用于初创公司和新项目的需求。 ... [详细]
  • 阿里宝卡用户能否在UC浏览器极速版中享受免流量服务?
    本文详细介绍了UC浏览器极速版是否支持阿里宝卡的免流量功能,以及如何正确设置以确保免流量服务的正常使用。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • Ulysses Mac v29:革新文本编辑与写作体验
    探索Ulysses Mac v29,这款先进的纯文本编辑器为Mac用户带来了全新的写作和编辑环境。它不仅具备简洁直观的界面,还融合了Markdown等标记语言的最佳特性,支持多种格式导出,并提供强大的组织和同步功能。 ... [详细]
  • 苹果系统频繁弹窗提示无法验证服务器身份?竟是网易邮箱证书过期所致
    近日,众多苹果用户发现iOS、iPadOS和macOS系统频繁弹出无法验证服务器身份的警告。问题根源在于网易邮箱未能及时更新其数字证书,导致原证书过期后无法被信任。 ... [详细]
  • 2017年苹果全球开发者大会即将开幕,预计iOS将迎来重大更新,同时Siri智能音箱有望首次亮相,AI技术成为大会焦点。 ... [详细]
  • 使用C# .NET构建UDP点对点聊天应用
    本文详细介绍如何利用C# .NET框架开发一个基于UDP协议的点对点聊天程序,包括客户端与服务器之间的连接建立、数据传输等核心功能。 ... [详细]
  • MLB正式开放可穿戴技术的应用
    据知情人士透露,美国职业棒球大联盟(MLB)计划在当前赛季内引入两款先进的可穿戴设备,旨在提升球员健康管理和性能分析能力。这两款设备分别是能够测量肘关节压力的Motus袖套和能监控心跳与呼吸速率的Zephyr Bioharness。 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
  • 力扣93:复原IP地址问题解析(Golang实现)
    本文探讨了力扣平台上的第93号问题——复原IP地址。该问题要求从给定的纯数字字符串中,通过添加分隔符‘.’来构建所有可能的有效IP地址。有效IP地址由四个介于0至255之间的整数组成,不允许出现前导零。 ... [详细]
author-avatar
幽雅闲居xl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有