• P06 GridBagLayout


    系统:Win10
    Java:1.8.0_333
    IDEA:2020.3.4
    Gitee:https://gitee.com/lijinjiang01/JavaSwing

    1.概述

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

    2. 约束: GridBagConstraints

    GridBagConstraints,封装了若干对组件的约束属性,每个由 GridBagLayout 管理的 组件都关联一个该约束实例,以指定 组件所在显示区域 的具体放置位置,以及 组件在其显示区域中 的对齐方式。
    给组件添加约束: GridBagLayout.setConstraints(Component comp, GridBagConstraints c)
    提示: 要理解 组件(所在)显示区域(一个或多个单元格组成) 和 组件在其显示区域中的对齐方式 这两个不同的概念

    3. 属性: GridBagConstraints 的属性

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

    3.1 显示区域 约束属性

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

    3.1.1 gridx, gridy

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

    3.1.2 gridwidth, gridheight

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

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

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

    3.1.3 weightx, weighty

    如何 分布额外空间(单元格区域外,容器边缘内 的间隔),当指定行/列中的其中 任意一个 组件的权重(大于0),则该行/列将(和其他行/列按权重比例)分配额外的水平/竖直空间。当权重为 0(默认值)时,则 整个单元格区域 居中于容器中心。
    提示: 如果调用了 java.awt.Window.pack() 方法,该值无效,因为 pack 后已无额外的空间

    3.2 组件 约束属性

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

    3.2.1 fill

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

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

    3.2.2 anchor

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

    绝对值相对于方向的值相对于基线的值
    NORTHPAGE_STARTBASELINE
    SOUTHPAGE_ENDBASELINE_LEADING
    WESTLINE_STARTBASELINE_TRAILING
    EASTLINE_ENDABOVE_BASELINE
    NORTHWESTFIRST_LINE_STARTABOVE_BASELINE_LEADING
    NORTHEASTFIRST_LINE_ENDABOVE_BASELINE_TRAILING
    SOUTHWESTLAST_LINE_STARTBELOW_BASELINE
    SOUTHEASTLAST_LINE_ENDBELOW_BASELINE_LEADING
    CENTER(默认值)BELOW_BASELINE_TRAILING

    3.2.3 ipadx, ipady

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

    3.2.4 insets

    组件的外部填充(可看做是 组件的外边距,也可看做是 显示区域 的内边距),即 组件 与其 显示区域边缘 之间间距的最小量
    提示: 上面各属性值之间,以及其他因素,有可能存在冲突或不兼容,不一定设置了即有效,建议多做实验,多写测试 Demo 去尝试

    4.代码实例

    各按钮约束参数
    Button01, Button02, Button03:默认
    Button04:gridwidth = REMAINDER、fill = BOTH
    Button05:gridwidth = REMAINDER、fill = BOTH
    Button06:gridwidth = 2、fill = BOTH
    Button07:gridwidth = REMAINDER、fill = BOTH
    Button08:gridheight = 2、fill = BOTH
    Button09:gridwidth = REMAINDER、fill = BOTH
    Button10:gridwidth = REMAINDER、fill = BOTH

    import com.lijinjiang.beautyeye.BeautyEyeLNFHelper;
    import javax.swing.*;
    import java.awt.*;
    
    public class GridBagLayoutDemo {
        public static void main(String[] args) {
            try {
                BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.generalNoTranslucencyShadow;
                BeautyEyeLNFHelper.launchBeautyEyeLNF();
            } catch (Exception e) {
            	e.printStackTrace();
            }
            JFrame frame = new JFrame("GridBagLayoutDemo");
    
            GridBagLayout gridBagLayout = new GridBagLayout();    // 布局管理器
            GridBagConstraints c = null;                    // 约束
    
            JPanel panel = new JPanel(gridBagLayout);
    
            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();
            gridBagLayout.addLayoutComponent(btn01, c); // 内部使用的仅是 c 的副本
    
            // Button02
            c = new GridBagConstraints();
            gridBagLayout.addLayoutComponent(btn02, c);
    
            // Button03
            c = new GridBagConstraints();
            gridBagLayout.addLayoutComponent(btn03, c);
    
            // Button04 显示区域占满当前行剩余空间(换行),组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn04, c);
    
            // Button05 显示区域独占一行(换行),组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn05, c);
    
            // Button06 占两列,组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = 2;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn06, c);
    
            // Button07 放置最后剩余空间,组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn07, c);
    
            // Button08 显示区域占两行,组件填充显示区域
            c = new GridBagConstraints();
            c.gridheight = 2;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn08, c);
    
            // Button09 显示区域占满当前行剩余空间(换行),组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.addLayoutComponent(btn09, c);
    
            // Button10 显示区域占满当前行剩余空间(换行),组件填充显示区域
            c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.fill = GridBagConstraints.BOTH;
            gridBagLayout.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);
    
            frame.setContentPane(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    5.效果演示

    在这里插入图片描述

  • 相关阅读:
    python curl2pyreqs 生成接口脚本
    顾客点餐系统(1)-------整体项目目标+用户数据表的操作
    对毕业季即将踏入职场的年轻人的一点建议
    git版本管理的使用
    人工智能在网络安全中的重要性
    读周志华《机器学习》第四章--决策树
    Codeforces Round 895 (Div. 3) C. Non-coprime Split
    SAP SEGW 事物码里的 Association 建模方式
    使用requests库解决Session对象设置超时的问题
    PHP写一个 电商Api接口需要注意哪些?考虑哪些?
  • 原文地址:https://blog.csdn.net/qq_35132089/article/details/126812199