Java学习笔记7.1.2 初探Swing世界 - 布局管理器

news2024/11/13 23:23:00

文章目录

  • 零、本讲学习目标
  • 一、布局管理器
  • 二、边框布局管理器(BorderLayout)
    • (一)边框布局管理器概述
    • (二)边框布局管理器API文档
    • (三)边框布局管理器使用方法
    • (四)边框布局案例演示
  • 三、流式布局管理器(FlowLayout)
    • (一)流式布局管理器概述
    • (二)流式布局管理器API文档
    • (三)流式布局管理器构造方法
    • (四)流式布局案例演示
  • 四、网格布局管理器(GridLayout)
    • (一)网格布局管理器概述
    • (二)网格布局管理器API文档
    • (三)网格布局管理器构造方法
    • (四)网格布局特点
    • (五)网格布局案例演示
  • 五、完善登录窗口界面
  • 六、课后作业
    • 任务:创建修改密码窗口

零、本讲学习目标

  1. 了解Swing提供的布局管理器
  2. 掌握边框布局管理器的基本使用
  3. 掌握流式布局管理器的基本使用
  4. 掌握网格布局管理器的基本使用

一、布局管理器

  • Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由AWT布局管理器来决定的。

在这里插入图片描述

二、边框布局管理器(BorderLayout)

(一)边框布局管理器概述

  • BorderLayout(边框布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)。组件可以被放置在这五个区域中的任意一个位置。

(二)边框布局管理器API文档

  • https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/BorderLayout.html
    在这里插入图片描述

(三)边框布局管理器使用方法

  • 向边框布局管理器的容器中添加组件时,需要使用add(Component comp, Object constraints)方法。
  • 参数comp表示要添加的组件,constraints指定将组件添加到布局中的位置,它是一个Object类型。
  • 传参时可以使用BorderLayout类提供的5个常量设置组件位置,它们分别是PAGE_START [NORTH]PAGE_END [SOUTH]LINE_START [WEST]LINE_END [EAST]CENTER
  • 边框布局的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。
  • 向边框布局加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域。
  • 每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。

(四)边框布局案例演示

  • c07.s01.p02包里里创建BorderLayoutDemo
    在这里插入图片描述
package c07.s01.p02;

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

/**
 * 功能:边框布局演示
 * 作者:华卫
 * 日期:2022年12月11日
 */
public class BorderLayoutDemo extends JFrame {
    public BorderLayoutDemo(String title) throws HeadlessException {
        super(title); // 调用父类构造方法传入标题参数
        initGUI(); // 调用初始化图形用户界面方法
    }

    /**
     * 初始化图形用户界面方法
     */
    private void initGUI() {
        // 设置边框布局管理器
        setLayout(new BorderLayout());
        // 设置窗口边界
        setBounds(200, 200, 400, 300);
        // 设置屏幕居中(采用相对定位方式)
        setLocationRelativeTo(null);

        // 创建五个按钮
        JButton btnNorth = new JButton("北方");
        JButton btnSouth = new JButton("南方");
        JButton btnWest = new JButton("西方");
        JButton btnCenter = new JButton("中原");
        JButton btnEast = new JButton("东方");

        // 添加按钮到窗口指定区域
        add(btnNorth, BorderLayout.PAGE_START); // BorderLayout.NORTH
        add(btnSouth, BorderLayout.PAGE_END);   // BorderLayout.SOUTH
        add(btnWest, BorderLayout.LINE_START);  // BorderLayout.WEST
        add(btnCenter, BorderLayout.CENTER);
        add(btnEast, BorderLayout.LINE_END);   // BorderLayout.EAST

        // 设置窗口可见
        setVisible(true);
        // 设置默认关闭方式(关闭窗口就退出应用程序)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new BorderLayoutDemo("边框布局演示");
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述

  • 温馨贴士:在使用边框布局管理器过程中,当使用add(Component comp, Object constraints)方法向容器区域中添加指定组件和位置时,除了可以使用前面介绍的PAGE_STARTPAGE_ENDLINE_STARTLINE_ENDCENTER常量参数指定组件位置,也可以使用NORTHSOUTHEASTWESTCENTER常量参数来指定组件位置,只不过案例演示里使用的常量参数是JDK 1.4版本开始出现的,适合不同语言标准,也是官方相对推荐的。

三、流式布局管理器(FlowLayout)

(一)流式布局管理器概述

  • FlowLayout(流式布局管理器)是最简单的布局管理器。在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。

(二)流式布局管理器API文档

  • https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/FlowLayout.html
    在这里插入图片描述

(三)流式布局管理器构造方法

方法声明功能描述
FlowLayout()组件默认居中对齐,水平、垂直间距默认为5个单位
FlowLayout(int align)指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位
FlowLayout(int align, int hgap, int vgap)指定组件的对齐方式和水平、垂直间距
  • 参数align决定组件在每行中相对于容器边界的对齐方式,分别为左对齐、右对齐、居中对齐。
  • 对齐方式可以使用该类中提供的常量FlowLayout.LEFTFlowLayout.RIGHTFlowLayout.CENTER表示。
  • 参数hgap和参数vgap分别设定组件之间的水平和垂直间距,可以填入一个任意数值。

(四)流式布局案例演示

  • c07.s01.p02包里创建FlowLayoutDemo
    在这里插入图片描述
package c07.s01.p02;

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

/**
 * 功能:流式布局演示
 * 作者:华卫
 * 日期:2022年12月11日
 */
public class FlowLayoutDemo extends JFrame {
    public FlowLayoutDemo(String title) throws HeadlessException {
        super(title); // 调用父类构造方法传入标题参数
        initGUI(); // 调用初始化图形用户界面方法
    }

    /**
     * 初始化图形用户界面方法
     */
    private void initGUI() {
        // 设置流式布局管理器
        setLayout(new FlowLayout(FlowLayout.LEFT, 20, 30));
        // 设置窗口边界
        setBounds(200, 200, 400, 300);
        // 设置屏幕居中(采用相对定位方式)
        setLocationRelativeTo(null);

        // 创建五个按钮
        JButton button1 = new JButton("第一个按钮");
        JButton button2 = new JButton("第二个按钮");
        JButton button3 = new JButton("第三个按钮");
        JButton button4 = new JButton("第四个按钮");
        JButton button5 = new JButton("第五个按钮");

        // 添加按钮到窗口
        add(button1);
        add(button2);
        add(button3);
        add(button4);
        add(button5);

        // 设置窗口可见
        setVisible(true);
        // 设置默认关闭方式(关闭窗口就退出应用程序)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new FlowLayoutDemo("流式布局演示");
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述

四、网格布局管理器(GridLayout)

(一)网格布局管理器概述

  • GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件。添加到容器中的组件会从左向右、从上向下依次填充到网格中。与FlowLayout布局管理器不同,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域。

(二)网格布局管理器API文档

  • https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/GridLayout.html
    在这里插入图片描述

(三)网格布局管理器构造方法

方法声明功能描述
GridLayout()默认只有一行,每个组件占一列
GridLayout(int rows, int cols)指定容器的行数和列数
GridLayout(int rows, int cols, int hgap, int vgap)指定容器的行数和列数以及组件之间的水平、垂直间距
  • 说明:参数rows代表行数,cols代表列数,hgapvgap规定窗格之间水平和垂直方向的间距。

(四)网格布局特点

  • 对于网格布局,组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。存在一个缺点:总是忽略组件的最佳大小,所有组件的宽高都相同。

(五)网格布局案例演示

  • c07.s01.p02包里创建GridLayoutDemo
    在这里插入图片描述
package c07.s01.p02;

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

/**
 * 功能:网格布局演示
 * 作者:华卫
 * 日期:2022年12月11日
 */
public class GridLayoutDemo extends JFrame {
    public GridLayoutDemo(String title) throws HeadlessException {
        super(title); // 调用父类构造方法传入标题参数
        initGUI(); // 调用初始化图形用户界面方法
    }

    /**
     * 初始化图形用户界面方法
     */
    private void initGUI() {
        // 设置网格布局管理器
        setLayout(new GridLayout(3, 3, 10, 5));
        // 设置窗口边界
        setBounds(200, 200, 400, 300);
        // 设置屏幕居中(采用相对定位方式)
        setLocationRelativeTo(null);

        // 创建五个按钮
        JButton button1 = new JButton("第一个按钮");
        JButton button2 = new JButton("第二个按钮");
        JButton button3 = new JButton("第三个按钮");
        JButton button4 = new JButton("第四个按钮");
        JButton button5 = new JButton("第五个按钮");
        JButton button6 = new JButton("第六个按钮");
        JButton button7 = new JButton("第七个按钮");
        JButton button8 = new JButton("第八个按钮");

        // 添加按钮到窗口
        add(button1);
        add(button2);
        add(button3);
        add(button4);
        add(button5);
        add(button6);
        add(button7);
        add(button8);

        // 设置窗口可见
        setVisible(true);
        // 设置默认关闭方式(关闭窗口就退出应用程序)
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new GridLayoutDemo("网格布局演示");
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述

五、完善登录窗口界面

  • c07.s02.p01包里的LoginFrame类拷贝到c07.s01.p02
    在这里插入图片描述

  • 修改LoginFrame的initGUI()方法,设置布局,添加面板与组件

package c07.s01.p02;

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

/**
 * 功能:登录窗口
 * 作者:华卫
 * 日期:2022年12月11日
 */
public class LoginFrame extends JFrame {
    /**
     * 构造方法 
     *
     * @param title
     * @throws HeadlessException
     */
    public LoginFrame(String title) throws HeadlessException {
        super(title); // 调用父类构造方法传入标题参数
        initGUI(); // 调用初始化图形用户界面方法
    }

    /**
     * 初始化图形用户界面方法
     */
    private void initGUI() {
        // 创建三个面板
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        // 获取内容面板
        JPanel panel = (JPanel) getContentPane();
        // 设置面板panel的布局为表格布局
        panel.setLayout(new GridLayout(3,1));
        // 将三个小面板添加到面板panel里
        panel.add(panel1);
        panel.add(panel2);
        panel.add(panel3);

        /* 第一个面板里要添加用户名标签与文本框 */
        // 创建用户名标签
        JLabel lblUsername = new JLabel("用户名:");
        // 创建用户名文本框
        JTextField txtUsername = new JTextField(15);
        // 将标签与文本框添加到第一个面板
        panel1.add(lblUsername);
        panel1.add(txtUsername);

        /* 第二个面板里要添加密码标签与文本框 */
        // 创建密码标签
        JLabel lblPassword = new JLabel("密    码:");
        // 创建密码文本框
        JPasswordField txtPassword = new JPasswordField(15);
        // 将标签与文本框添加到第二个面板
        panel2.add(lblPassword);
        panel2.add(txtPassword);

        /* 第三个面板里要添加两个按钮 */
        // 创建登录按钮
        JButton btnLogin = new JButton("登录");
        // 创建取消按钮
        JButton btnCancel = new JButton("取消");
        // 将两个按钮添加到第三个面板
        panel3.add(btnLogin);
        panel3.add(btnCancel);

        // 设置窗口边界
        setBounds(200, 200, 300, 200);
        // 设置屏幕居中
        setLocationRelativeTo(null);
        // 设置窗口紧凑
        pack();
        // 设置窗口可见
        setVisible(true);
        // 设置默认关闭方式
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    /**
     * 主方法
     *
     * @param args
     */
    public static void main(String[] args) {
        // 实例化登录窗口对象
        LoginFrame loginFrame = new LoginFrame("登录窗口");
        JDialog dialog;
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述
  • 可以在用户名与密码文本框里输入数据,并且密码文本框回显的是一串大圆点
  • 单击【确定】和【取消】按钮,没有任何反应,因为我们还没有编写事件处理方法
  • 下一讲,我们会学习Swing事件处理机制,然后我们再来改进这个登录窗口程序。

六、课后作业

任务:创建修改密码窗口

  • 继承JFrame,创建ChangePasswordFrame
  • 设置布局,添加组件,设置窗口属性
  • 用户名文本框不可用(调用setEnabled()方法,传入false参数)
  • 给两个按钮设置热键字母(调用setMnemonic()方法)
    在这里插入图片描述
btnOK = new JButton("确定[O]");
btnOK.setMnemonic(KeyEvent.VK_O);
btnCancel = new JButton("取消[C]");
btnCancel.setMnemonic(KeyEvent.VK_C);

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

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

相关文章

Java项目:SSM在线物流综合管理平台系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,后台为管理员登录; 管理员角色包含以下功能 管理员登录,管理员管理,合作公司管理,车型信息,货物基本…

MongoDB 数据库安装详细教程

1. MongoDB 下载流程 (急用)直接抵达:Download MongoDB Community Server | MongoDB 打开MongoDB官网:MongoDB (点击进入) 下载完成之后双击打开会出现如下界面: 2. MongoDB 环境配置 通过刚刚的安装知道了MongoDB Se…

人工智能--决策树原理与代码实现、特征提取、回归决策树

决策树:本质就是一个拥有多个判断节点的树 1,熵 系统越有序,集中,熵值越低;系统越混乱,越分散,熵值越高 在这里的计算中,log2记为1,通常以2为底 2,决策树…

Matlab|基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

SpringBoot中使用Easyexcel实现Excel导入导出功能(三)

导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少。通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.converters.Converter);假如有这样一个场景&…

mysql学习-- 聚合函数,group by理解与使用

文章目录聚合函数定义常用的聚合函数group by的使用使用单个列进行分组根据多个列进行分组having 的使用作用要求sql 语法sql92语法:sql99语法:sql语句的执行过程(进理解为主):聚合函数 定义 作用一组数据&#xff0…

ArcGIS Pro为CAD设置投影

将CAD加载到GIS中,经常出现与GIS数据不能重合的问题。 现在的国空规划的数据基本都是CGCS2000,不重叠的原因不太可能是因为地理坐标系不统一,那极有可能就是ArcGIS的动态投影与CAD的带号没有统一。 如下图,左边为ArcGIS动态投影…

宠物之家网站大学生网页制作教程 学生HTML静态宠物网页设计作业成品 DIV布局简单动物网页制作代码

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

宝塔无法安装fileinfo扩展解决办法(小白篇)

宝塔无法安装fileinfo扩展解决办法(小白篇) 宝塔无法php安装fileinfo扩展的方法:手动安装 重装系统登录宝塔先不要安装其他软件,先设置swap是Linux下的虚拟内存,设置内存后先安装PHP版本,安装好PHP以后&…

Python实现数据结构与算法(三)链表

链表 为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。 链表的定义 链表&#xf…

html内联框架iframe

<!--iframe内联框架src&#xff1a;地址w-h&#xff1a;宽度高度 --> <iframe src"https://www.4399.com" frameborder"0" width"800px" height"800px"></iframe> 使用name属性&#xff1a; <!--回顾&#xff1…

Allegro如何创建差分对操作指导

Allegro如何创建差分对操作指导 Allegro可以在规则管理器里面进行差分对的创建,让两个网络以差分的形式布线,具体操作如下 打开规则管理器 选择Physical-net-All layers 选择两个需要创建差分对的网络,选择Create-Differential Pair 输入差分对的名字 选择Create 差分…

【MATLAB教程案例58】使用matlab实现yolov2网络目标检测功能与仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.yolo网络理论概述

Python画3D足球2

文章目录前情提要补点球形膨胀前情提要 足球是正五边形和正六边形拼接而成&#xff0c;由此形成的骨架结构&#xff0c;可通过切割正二十面体获得&#xff0c;所以画足球的第一步是画正二十面体&#xff1a;Python绘制正二十面体 在学会绘制正二十面体之后&#xff0c;就可以…

【JavaWeb开发-Servlet】老人言随机语录

需求&#xff1a;点击网页按钮随机显示一句话&#xff1a; 1、内容涵盖&#xff1a; 老人言、励志语录、名言名言、一句情话 2、设计要求&#xff1a; 以老人言为例&#xff1a;①在数据库创建一张表&#xff0c;存放老人言经典语录。字段包括&#xff1a;id、sentence。id为in…

腾讯云特惠专区——永久有效

腾讯云—腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算、大数据、人工智能服务,以及定制化行业解决方案和提供可靠企业上云服务。 购买腾讯云的优势是新用户特别便宜;国内访问速度快;个人认证可秒过;缺点是:网站内容或者…

论文投稿指南——中文核心期刊推荐(机械、仪表工业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384;&#x1f388; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff…

java计算机毕业设计ssm医院预约挂号系统b9971(附源码、数据库)

java计算机毕业设计ssm医院预约挂号系统b9971&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

C# 运算符与表达式

一 运算符 ① 算术运算符&#xff1a;、-、、/、%、、–; ② 关系运算符&#xff1a;>,<,>,<,,!; ③ 逻辑运算符&#xff1a;!,&,|,^,&&,||; ④ 位运算符&#xff1a;&,|,^,~,>>,<<; ⑤ 赋值运算符&#xff1a; 扩展赋值运算符&#…

ESP32 ESP-IDF LVGL8.3.3移植

陈拓 2022/11/27-2022/12/10 1. 概述 在《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示》 ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示_晨之清风的博客-CSDN博客_esp32 tftlcd在ESP32开发框架ESP-IDF中用LVGL库驱动TFT-LCD(ST7735 128x160) 显示屏演示GUIhttps://bl…