滚雪球学Java(89):Java GUI入门与进阶:AWT核心概念深度解析,有两下子!

本文主要是介绍滚雪球学Java(89):Java GUI入门与进阶:AWT核心概念深度解析,有两下子!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

  今天我们来玩个有意思的东西,如何通过Java语言来绘画界面?这个大家肯定都很好奇,不是前端干的活,怎么Java也是可以用于来实现界面化?是的,我的回答是肯定的。我们处于在Java的开发语言中,GUI(图形用户界面)编程它是一个重要的领域。Java提供了多种方式来创建GUI应用程序,其中AWT(Abstract Window Toolkit)是最早出现的工具包之一。AWT作为一个抽象的窗口工具集,为Java程序提供了丰富的窗口组件和绘图能力,它真的超级有趣,今天我就要带着大家好好玩一局。

摘要

  本文我将会带着大家深入探讨JavaSE中的AWT,包括其基本概念、组件、事件处理机制以及如何使用AWT创建GUI应用程序。通过案例代码、案例分享和实际测试用例,本文将帮助大家理解AWT的工作原理和应用场景,以至于大家都能掌握实现简单窗口的程序能力为止,如果你不会,你一定要提出来,因为我必须会把你教会。

正文

  如下我们便开启今日的正文内容了,大家做好准备了没?

概述

  首先,我们先来了解下AWT的概念,何为AWT?可能很多小伙伴都不清楚,不碍事,这里我会给大家讲解清楚。它可以说是Java最初的GUI工具包,它包含了一系列的类,用于创建和管理窗口、按钮、文本框等GUI组件。AWT是基于本地操作系统的GUI库实现的,这使得它能够提供与操作系统一致的界面元素。如果要我再具体点,请看如下:

  AWT,全称是Abstract Window Toolkit,是Java语言中用来创建图形用户界面(GUI)的一个工具包。它提供了一套丰富的组件和工具,让开发者能够构建出美观且功能强大的应用程序界面。

  你无妨想象一下,AWT就像是一个工具箱,里面装满了各种工具和材料,比如锤子、钉子、螺丝刀等。当你想建造一个房子时,你可以从这个工具箱中挑选你需要的工具。同样,当你想用Java语言开发一个应用程序的界面时,你可以从AWT这个工具箱中选择你需要的组件,比如按钮、文本框、菜单等。

特点

  AWT的特点可以用以下几个方面来概括:

  1. 抽象性:AWT提供了一个抽象层,使得开发者不需要关心底层操作系统的细节,就可以创建跨平台的GUI应用程序。

  2. 组件丰富:AWT包含了多种基本的GUI组件,如按钮(Button)、标签(Label)、文本框(TextField)等,这些组件可以满足大多数基本的界面设计需求。

  3. 事件驱动:AWT应用程序是基于事件驱动的,这意味着应用程序的执行流程是由用户的操作(如点击按钮、选择菜单项等)来驱动的。

  4. 绘图能力:AWT还提供了一套绘图API,允许开发者在组件上绘制图形和文本,实现更复杂的视觉效果。

  5. 线程安全:AWT的组件是线程安全的,这意味着它们可以在多线程环境中安全使用,而不会出现数据不一致的问题。

  6. 性能:虽然AWT是Java GUI开发的基石,但随着技术的发展,它的性能和外观可能不如一些更现代的替代品,如Swing。

  总的来说,AWT就像是Java GUI开发的一块基石,虽然它可能不是最闪亮或最现代的,但它为Java应用程序的界面开发提供了坚实的基础。随着技术的进步,许多新的工具和库(如Swing和JavaFX)已经出现,提供了更丰富的功能和更好的性能,但AWT依然是理解Java GUI开发的重要起点。

案例演示

  这里,我们通过上述所讲,通过一个案例,来跟大家简单实现一下。对于AWT,它的核心类是java.awt.Component,它是所有AWT组件的基类。以下是创建一个简单AWT窗口的示例代码:

import java.awt.*;
import javax.swing.*;public class AwtWindowExample {public static void main(String[] args) {Frame frame = new Frame("AWT Window Example");frame.setSize(300, 200);frame.setLayout(new FlowLayout());Button button = new Button("Click Me!");frame.add(button);frame.setVisible(true);}
}

代码解析:

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  这段Java代码演示了如何使用AWT库创建一个简单的窗口应用程序。下面是代码的逐行解析:

  1. import java.awt.*;:导入AWT库中的所有类。这使得我们可以使用AWT提供的各种组件和方法。

  2. import javax.swing.*;:导入Swing库中的所有类。Swing是AWT的扩展,提供了更多的组件和功能。

  3. public class AwtWindowExample {:定义了一个名为AwtWindowExample的公共类。

  4. public static void main(String[] args) {:定义了程序的入口点,即main方法。这个方法是程序执行的起点。

  5. Frame frame = new Frame("AWT Window Example");:创建了一个Frame对象,这是AWT中用于表示窗口的组件。我们给这个窗口设置了一个标题"AWT Window Example"。

  6. frame.setSize(300, 200);:设置窗口的大小为宽300像素,高200像素。

  7. frame.setLayout(new FlowLayout());:为窗口设置布局管理器。这里使用的是FlowLayout,它是一种简单的布局管理器,按照组件添加的顺序从左到右、从上到下排列组件。

  8. Button button = new Button("Click Me!");:创建了一个Button对象,并设置按钮上显示的文本为"Click Me!"。

  9. frame.add(button);:将创建的按钮添加到窗口中。由于使用了FlowLayout,按钮会被添加到窗口的下一个可用位置。

  10. frame.setVisible(true);:设置窗口为可见状态。这会触发窗口的显示,用户可以在屏幕上看到这个窗口。

  需要注意的是,这段代码中虽然导入了Swing库,但实际上并没有使用到Swing的任何组件或功能。此外,代码中使用的Frame类在Swing中已经被JFrame类所取代,因为JFrame提供了更多的功能和更好的事件处理能力。但是,为了演示AWT的基本用法,这里使用了Frame类。

  最后,这段代码没有包含事件监听器的设置,所以按钮点击不会有任何反应。在实际的应用开发中,通常会为按钮添加一个事件监听器来处理用户的点击事件。

使用案例

  考虑一个简单的计算器程序,使用AWT组件实现。该程序包含文本框、按钮和标签,用户可以通过点击按钮执行加法或减法运算。再者,也可以用它来制作写小游戏,像我之前就用它实现了一个改良版的贪吃蛇,还是非常有意思的。这个我后续再逐步与大家说。

应用场景案例列举

  1. 桌面应用程序:需要与操作系统紧密集成的桌面应用程序。
  2. 快速原型开发:需要快速展示GUI原型时,可以使用AWT。
  3. 教学和学习:由于AWT的简单性,它常被用于教学和学习Java GUI编程。

优缺点分析

  接着,对于连接池,我也是需要跟大家兜个底,所有被开发创造出来的事物,都有其好的一面跟不好的一面,需要辩证对待,比如说:

优点

  • 与操作系统集成:AWT组件与本地操作系统的GUI控件一致。
  • 简单易用:AWT提供了简单的API来创建GUI组件。

缺点

  • 性能问题:由于AWT组件是重量级的,它们可能不如Swing组件高效。
  • 跨平台外观:AWT组件的外观和感觉受限于本地操作系统,可能不会在所有平台上提供一致的体验。

类代码方法介绍

这里,我主要是给大家普及一下,AWT中一些重要的类和它们的用途包括:

  • Frame:用于创建窗口。
  • Panel:用于组织和布局其他组件。
  • Button:用于创建按钮。
  • Label:用于显示文本或图像。
  • TextField:用于输入文本。

测试用例

  这里,我主打一个理论实践相结合的教学模式,当然, 我也是为了给大家演示一下,如何通过AWT组件实现一个简单的窗口程序。诺,大家请看,以下是一个使用AWT组件的简单测试用例,演示了如何创建窗口和按钮,仅供参考:

测试代码

  具体完整的测试代码请参考如下:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024年7月9日15:01:32*/
public class AwtTest {public static void main(String[] args) {Frame f = new Frame("AWT Test");f.setSize(400, 400);f.setLayout(new BorderLayout());Button b = new Button("Test Button");Label messageLabel = new Label("这里是默认消息", Label.CENTER);// 使用默认的对话框字体,这通常支持中文字符messageLabel.setFont(new Font("Dialog", Font.PLAIN, 12));b.setFont(new Font("Dialog", Font.PLAIN, 12));// 添加事件监听器b.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {messageLabel.setText("bug菌在线测试!更多请关注公众号【猿圈奇妙屋】");}});f.add(b, BorderLayout.NORTH);f.add(messageLabel, BorderLayout.SOUTH);f.setVisible(true);}
}

  注意,在使用IDEA窗体添加button按钮,label标签时,可能会遇到显示的中文变成方框这一问题,若你运行之后也是如下乱码界面,如下:那么你往后看,我会一步一步教你把中文展示正常。

解决中文展示为框框问题教学

  在 Java AWT 程序中,如果中文显示出现乱码,这通常是因为默认的字符编码不是 UTF-8 或者没有正确设置字符编码。以下是解决乱码问题最直接最有效的方法,请参考:

1、第一,你编辑器如果用的是idea,那你直接右上角打开【Edit Configurations…】选项。演示如下:

2、打开之后,找到如下界面中的【Modify options】蓝色按钮,演示如下:

3、我们在其弹框中,把【Add VM options】勾选上。

4、然后选完后,关闭,会看到多出来一行,这一行,我们直接指定编码即可。演示如下:

5、然后输入如下这行设置编码即可。

-Dfile.encoding=GBK

6、设置完后,我们重新启动main函数,我们就可以看到,其中文可以正常展示啦。

7、我们继续来测试我们上述的案例,我们通过鼠标来点击【Test Button】按钮试试。


8、我们所设置的按钮触发事件成功把展示内容替换成功了,成功展示了我们所想要显示的内容了。截图如下:

  看到如上界面,大功告成,虽然界面有点丑,但我主要是为了演示为主,具体美化,这个大家可以琢磨一下。

测试代码运行结果

  根据如上的测试用例,作者在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。

  最终的操作界面如下:

测试代码解析

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  如上测试代码是一个简单的AWT(Abstract Window Toolkit)应用程序,用于创建一个带有按钮和标签的窗口。下面是我对代码的逐行解析:

1-2. 导入了java.awt包中的组件和事件处理类,这是创建图形用户界面(GUI)所必需的。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

4-11. 定义了一个名为AwtTest的公共类,它包含了主方法main,这是Java程序的入口点。

public class AwtTest {public static void main(String[] args) {// ...}
}

13-14. 创建了一个Frame对象,这是AWT中最基本的窗口组件,用于显示应用程序的窗口。

Frame f = new Frame("AWT Test");

16-17. 设置窗口的大小为400x400像素,并设置布局管理器为BorderLayout,这是一种将窗口分为五个区域(北、南、东、西、中)的布局方式。

f.setSize(400, 400);
f.setLayout(new BorderLayout());

19-20. 创建了一个Button对象和一个Label对象,分别用于显示一个按钮和一个标签。

Button b = new Button("Test Button");
Label messageLabel = new Label("这里是默认消息", Label.CENTER);

22-25. 为标签和按钮设置了字体样式,这里使用的是默认的对话框字体,大小为12号字体。

messageLabel.setFont(new Font("Dialog", Font.PLAIN, 12));
b.setFont(new Font("Dialog", Font.PLAIN, 12));

27-35. 为按钮添加了一个事件监听器,当按钮被点击时,会触发actionPerformed方法,该方法会更新标签的文本。

b.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {messageLabel.setText("bug菌在线测试!更多请关注公众号【猿圈奇妙屋】");}
});

37-38. 将按钮添加到窗口的北部(BorderLayout.NORTH),将标签添加到窗口的南部(BorderLayout.SOUTH)。

f.add(b, BorderLayout.NORTH);
f.add(messageLabel, BorderLayout.SOUTH);
  1. 调用setVisible(true)方法使窗口可见。
f.setVisible(true);

  测试案例我主要是为了展示如何使用AWT创建一个简单的GUI应用程序。当用户点击按钮时,标签的文本会更新为指定的消息。可以看到界面会成功把自定义的内容给展示出来。

  但是有一点大家需要注意,AWT是Java较老的GUI工具包,现在已经被Swing所取代,Swing提供了更多的组件和更好的事件处理机制。但是,AWT仍然是Java GUI编程的基础,了解AWT有助于更好地理解Swing,晓得吧,所以说,我们必须一步一步来,旧的新的都要掌握,而不是只想着学习最新的技术,咱们一口吞不下个胖子。

总结

  本文我以一种轻松幽默的方式,向大家介绍了Java SE中的AWT(Abstract Window Toolkit)及其在GUI编程中的应用。AWT作为Java最初的GUI工具包,提供了丰富的组件和绘图能力,允许开发者创建与操作系统紧密集成的桌面应用程序。文章通过一个简单的AWT窗口示例,详细解释了如何使用AWT组件创建窗口、设置布局、添加按钮和标签,并处理用户交互。

核心要点

  • AWT基础:AWT是Java的原始GUI工具包,提供了窗口、按钮、文本框等多种组件。
  • 事件驱动:AWT程序的执行流程由用户操作(如点击按钮)驱动。
  • 绘图能力:AWT允许开发者在组件上绘制图形和文本。
  • 线程安全:AWT组件可以在多线程环境中安全使用。
  • 性能考量:相较于现代的Swing,AWT组件可能在性能上存在局限。

教学案例

  文章通过一个AWT窗口示例,展示了如何创建基本的GUI应用程序。示例中包括了创建窗口、设置窗口大小和布局、添加按钮和标签,并为按钮添加事件监听器以更新标签文本。

中文乱码问题

  文章还特别提到了在AWT程序中可能遇到的中文乱码问题,并提供了解决方案,即通过设置虚拟机选项来指定正确的字符编码(如GBK)。

小结

  AWT作为Java GUI开发的基石,虽然在现代开发中可能不是首选,但它的学习和理解对于掌握更高级的GUI工具包如Swing和JavaFX仍然非常重要。通过本文的学习和实践,读者可以对AWT有一个基本的了解,并能够创建简单的GUI应用程序。同时,作者提供的额外资源和建议,也为读者进一步深入学习Java提供了方向。

结语

  最后,这篇深入浅出的AWT教程,能够让大家对Java的GUI编程有初步的认识,也能激发了大家进一步探索和学习的兴趣。希望同学们能够通过本文的学习和实践,逐步提升自己的编程技能,最终能够在Java的世界里自由翱翔。

… …

  ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

「赠人玫瑰,手留余香」,咱们下期拜拜~~

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


这篇关于滚雪球学Java(89):Java GUI入门与进阶:AWT核心概念深度解析,有两下子!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099810

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G