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

一、前言

记录时间 [2024-05-30]

疑问导航

  • GUI 是什么?
  • GUI 如何使用?
  • GUI 有哪些应用?

学习目的

  • 写一些自己心中的小工具;
  • Swing 界面的维护;
  • 了解 MVC 架构,以及监听事件。

本文对图形用户界面(GUI)编程进行概述,并对 GUI 的其中一个技术领域 AWT(Abstract Window Toolkit)进行讲述。文章使用 AWT 编写了 Frame 窗口,并为窗口添加了 Panel 面板,同时设置了关闭窗口的监听事件。


二、GUI 概述

GUI,全称为 Graphical User Interface,中文译为图形用户界面,是一种采用图形方式显示的计算机操作环境界面。

与传统的命令行界面(Command Line Interface, CLI)相比,GUI 提供了更为直观和用户友好的交互方式。在 GUI 环境下,用户可以通过鼠标、触摸屏等输入设备操作屏幕上的图标、菜单、按钮、对话框等图形元素,来完成文件管理、程序启动、设置调整等操作,而无需记忆和输入复杂的命令。

GUI 设计综合了计算机科学、视觉设计、人机交互等多个领域的知识,旨在提高软件的可用性和用户体验。它通过视觉指示和直接操作,减少了用户的学习成本,使计算机操作对非专业用户更加简便。

GUI 广泛应用于操作系统、软件应用、智能手机、平板电脑及各种其他数字设备中。


1. 关键组成

GUI 中包含一些关键组成,主要有如下这些:

  • 窗口:屏幕上可以包含单独文档、应用程序或控件的矩形区域。
  • 菜单:用户可以选择的动作或设置更改选项列表。
  • 图标:代表文件、应用程序或动作的小符号。
  • 按钮:用于启动动作或命令的可点击元素。
  • 滚动条:允许用户查看超出窗口可视区域的内容。
  • 复选框单选按钮:用于选择选项,其中复选框允许多项选择,而单选按钮限制每组中只能选择一个。
  • 文本框文本区域:用户可以输入文本的区域。
  • 下拉列表:为用户提供可从中选择一项的选项列表。

2. 核心技术

图形用户界面 GUI 的核心技术涉及多种编程库和框架,它们为开发者提供了构建和设计用户界面的工具和组件。这些技术各有所长,适用于不同场景和需求。

以下是几个关键的技术领域和相关技术栈:

  • AWT (Abstract Window Toolkit):这是 Java 语言最初提供的用于创建 GUI 的基本工具包。AWT 提供了一套跨平台的 GUI 组件,如窗口 Frame、按钮 Button、文本框 TextField 等,以及布局管理器来安排这些组件。尽管 AWT 组件被视为“重量级”(因为它们直接映射到宿主系统的 GUI 元素),但在某些场景下仍会被使用。
  • Swing:Swing 是构建在 AWT 之上的一个图形用户界面工具包,它提供了一套更丰富、更灵活的组件集,并且允许高度定制界面外观。Swing 组件是“轻量级”的,意味着它们在 Java 中完全由 Java 代码绘制,从而提供了更好的跨平台一致性。Swing 包含了如 JButtonJTextFieldJFrame 等组件,并支持主题和皮肤定制。
  • Qt:Qt 是一个跨平台的应用程序开发框架,广泛用于 C++ 编程,但也支持 Python、JavaScript 等其他语言。Qt 提供了一个完整的GUI 库,包括 QWidgets(传统的 GUI 组件)、QML(用于声明式用户界面设计)以及丰富的图形和多媒体功能。Qt 强调高性能和一致的用户体验。
  • GTK+/GTKmm:GTK+ 是一个开源的 GUI 工具包,主要用于 GNOME 桌面环境,支持 C 语言编写界面。GTKmm 则是其 C++ 封装版本。它们提供了构建 Linux 和 Unix 系统上图形界面应用所需的一切。
  • wxWidgets:这是一个 C++ 库,允许开发者编写一次代码,然后在多种平台上编译运行,包括 Windows、Mac OS X、Linux/Unix等。wxWidgets 提供了一套类似 MFC(微软基础类库)的 API,适合需要高度原生外观的应用程序。
  • PyQt/PySide:这是 Python 语言绑定的 Qt 库,允许 Python 开发者利用 Qt 的强大功能来创建 GUI 应用。PySide 是由 Qt Company 官方支持的绑定,而 PyQt 则是一个长期存在的社区项目。
  • Electron:Electron 允许使用 Web 技术(HTML,CSS,JavaScript)来构建跨平台的桌面应用程序。它结合了 ChromiumNode.js,使得 Web 开发者能够快速构建具有原生感受的应用。
  • Flutter:虽然最初是为了移动应用开发设计的,Flutter 也支持构建具有原生性能的桌面 GUI 应用。它使用 Dart 语言,提供了一套现代的组件库和强大的工具来实现高效的界面开发。

三、AWT

AWT(Abstract Window Toolkit)是 Java 的原始图形用户界面 GUI 工具包,它是 JFC( Java Foundation Classes)的一部分,旨在为 Java 应用程序提供基本的图形和用户界面元素。

AWT 的设计目的是实现跨平台的兼容性,即,使用 AWT 编写的程序应该能够在任何支持 Java 的平台上运行,而不需要修改。

在 Java 中使用 AWT 需要导入相关依赖:

import java.awt.*;

1. 核心特性

AWT 的核心特性主要如下:

  • 组件(Component):AWT 提供了一系列基本的 GUI 组件,例如 ButtonLabelTextFieldTextAreaCheckboxChoiceListScrollbar 等,这些都是构成用户界面的基本元素。
  • 容器(Container):容器是用来容纳和组织其他组件的地方,如 FramePanelWindow。开发者可以向容器中添加组件,并通过布局管理器(Layout Manager)来安排这些组件的位置和大小,以适应不同的屏幕尺寸和分辨率。
  • 事件处理(Event Handling):AWT 持事件驱动编程模型,通过监听器(Listeners)和事件(Event)来响应用户的操作,如鼠标点击、键盘输入等。开发者需要实现特定的接口或者使用匿名内部类来注册事件处理器。
  • 图形和图像(Graphics & Image):AWT 还包括基本的图形绘制功能,如画线、矩形、椭圆、文本等,以及加载和显示图像的能力。
  • 布局管理器(Layout Managers):为了实现组件在容器中的自动布局,AWT 提供了一些布局管理器,如 FlowLayoutBorderLayoutGridLayoutCardLayout 等,它们负责计算并设置每个组件的位置和大小。

四、Frame

在 GUI 编程中,Frame 作为顶层容器,用于承载和组织其他 GUI 组件,如按钮、文本框和标签,实质上构成了 Java 应用程序的主窗口

1. 基本概念

关于 Frame 的一些基本概念包括:

  • 顶层容器:Frame 是组件层级结构中的最高级别容器,意味着它是直接包含在操作系统桌面之下的窗口单元。
  • 窗口属性:Frame 可以设置标题 setTitle、大小 setSizesetPreferredSize、位置 setLocation,以及是否可调整大小 setResizable 等属性。
  • 关闭操作:可以通过设定默认关闭操作 setDefaultCloseOperation 来控制用户点击窗口关闭按钮时的行为,比如退出应用程序或仅仅隐藏窗口。
  • 内容面板:Frame 包含一个内容面板 ContentPane,其他组件通常添加到这个面板上而不是直接加到 Frame 上,以便于布局管理和装饰(如边框)。
  • 菜单栏:Frame 可以添加菜单栏 JMenuBar,为用户提供访问各种菜单项和命令的途径。
  • 对话框:Frame 常用于启动模态或非模态对话框,以完成特定任务或获取用户输入。

2. 案例分析

在 IDEA 中创建 Java 项目,在项目中新建 TestFrame 类,编写第一个 Frame 窗口。

  • 通过 new 关键字实例化 Frame 对象,通过构造方法为窗口命名;
  • setVisible(true):设置窗口可见;
  • setSize(width, height):设置窗口的宽度和高度;
  • setBackground():设置窗口的背景颜色;
  • setLocation(x, y):设置窗口弹出的初始位置;
  • setResizable(false):设置窗口的大小固定,不可更改。

运行单个窗口

编写代码

例如,运行单个 Frame 窗口,编写代码如下:

public class TestFrame {public static void main(String[] args) {// Frame JDK 看源码Frame frame = new Frame("我的第一个 Java 图像界面窗口");// 设置可见性frame.setVisible(true);// 设置窗口大小 width heightframe.setSize(400, 400);// 设置背景颜色 Colorframe.setBackground(new Color(220, 183, 225, 255));// 弹出的初始位置frame.setLocation(200, 200);// 设置大小固定frame.setResizable(false);}
}

运行效果

查看窗口,运行效果如下:

在这里插入图片描述


运行多个窗口

接下来尝试一次性运行多个 Frame 窗口。

封装

先通过封装的思想,创建 MyFrame 类用于快速构造 Frame 窗口, MyFrame 类继承自 Frame 类。

// 封装
class MyFrame extends Frame {// 可能存在多个窗口,需要一个计数器static int id = 0;public MyFrame(int x, int y, int w, int h, Color color) {//        super("MyFrame+" + (++id));super("" + (++id));// 设置背景颜色 ColorsetBackground(color);// 弹出的初始位置 x y// 设置窗口大小 width heightsetBounds(x, y, w, h);// 设置可见性setVisible(true);}
}

调用构造方法

调用构造方法,传参,快速创建四个 Frame 窗口,设置它们的初始位置。

// 展示多个窗口
public static void main(String[] args) {MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.blue);MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.yellow);MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.red);MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.green);}

运行效果

运行程序,四个窗口会一次性出现在屏幕上。

运行效果如图所示:

在这里插入图片描述


五、Panel

Panel 是一种中间容器,用于在 GUI 布局中组织和分组其他组件,如按钮 Button、标签 Label、文本框 TextField 等。它充当一个可控制的区域,开发者可以在其中放置和管理界面元素,以便更好地组织和设计用户界面。

面板 Panel 可以看成是一个空间,但是不能单独存在。

1. 基本用途

以下是关于 Panel 的一些基本用途和特点:

  • 布局管理:Panel 本身没有布局,但可以为其指定一个布局管理器(Layout Manager),如 FlowLayoutBorderLayoutGridLayout 等,来决定如何排列其中的组件。
  • 嵌套容器:Panel 可以嵌套在其他容器中,如 FrameDialog 或另一个 Panel 内,这样可以创建复杂的界面布局和分组逻辑。
  • 背景和边框:Panel 允许设置背景颜色或图像,以及添加边框 Border,以增强视觉效果和区分不同的功能区域。
  • 自定义绘图:通过重写 paintComponent(Graphics g) 方法,可以在 Panel 上进行自定义绘图,这对于绘制图形、图表或者实现特殊视觉效果非常有用。
  • 事件处理:Panel 可以注册监听器 Listener 来响应用户的各种事件,如鼠标点击、键盘输入等,从而实现与用户的交互逻辑。

2. 案例分析

使用面板 Panel

接下来尝试在 Frame 窗口中使用面板 Panel。

  • 首先设置窗口布局为空,否则会有默认的布局样式;
  • setBounds(x, y, w, h):快速设置 Frame 窗口的初始位置和宽高;
  • 设置 Panel 的初始位置和宽高,其初始位置是相对的,相对于 Frame 设置;
  • 把面板添加到窗口中,并设置窗口可见。

编写代码

例如,编写代码如下:

// 面板 Panel 可以看成是一个空间,但是不能单独存在
public class TestPanel {public static void main(String[] args) {Frame frame = new Frame("面板 Panel 测试");Panel panel = new Panel();// 设置布局为空,否则会有默认的frame.setLayout(null);// 坐标 背景颜色frame.setBounds(300, 300, 400, 400);frame.setBackground(new Color(204, 192, 131));// Panel 设置坐标,坐标相对于 framepanel.setBounds(50, 50, 300, 300);panel.setBackground(new Color(220, 183, 225));// 把面板 panle 添加到窗口 frame 中frame.add(panel);// 设置窗口可见frame.setVisible(true);}
}

运行效果

查看窗口,运行效果如下。中间紫色的部分是 Panel 面板。

在这里插入图片描述


添加监听事件

监听事件(Event Listening)是一种编程机制,用于捕获和响应用户操作或系统发生的特定情况,比如按钮点击、窗口关闭、鼠标移动等。这一机制使得程序能够动态地做出反应,提高交互性。

接下来在上述 Panel 案例中,为窗口的关闭按钮设置监听事件——当鼠标点击关闭按钮时,窗口关闭。

编写代码

// 监听事件,监听窗口关闭事件 System.exit(0)
// 适配器模式
frame.addWindowListener(new WindowAdapter() {// 窗口点击关闭的时候需要做的事情@Overridepublic void windowClosing(WindowEvent e) {// 结束程序System.exit(0);}
});

六、总结

本文对图形用户界面(GUI)编程进行概述,并对 GUI 的其中一个技术领域 AWT(Abstract Window Toolkit)进行讲述。文章使用 AWT 编写了 Frame 窗口,并为窗口添加了 Panel 面板,同时设置了关闭窗口的监听事件。


一些参考资料:

狂神说 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.rhkb.cn/news/336694.html

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

相关文章

基于BP神经网络的64QAM解调算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................... % 第一部分:加载并可视…

CSS绘制圆弧

css绘制如图的圆弧&#xff1a; 这种矩形弧形的效果中&#xff0c;弧形的效果一般是由一条曲线拉伸出来的&#xff0c;这条曲线往往是属于一个椭圆的&#xff0c;所以可以绘制一个椭圆&#xff0c;截取部分可视区域实现效果。 <style> .wrapper{width: 400px;height: 60…

Minio篇:初识MinIO

1. MinIO快速入门 1.1.MinIO核心概念 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 对象&#xff08;Object&#xff09; 对象是实际的数据单元&#xff0c;例如我们上传的一个图片。 存储桶&#xff08;Bucket&#xff09; 存储…

C语言分支和循环(2)

我的相关博客&#xff1a; C语言的分支与循环&#xff08;1&#xff09; 1.switch语句 除了 if 语句外&#xff0c;C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 的 if...else 结构&#xff0c;⽤于判断条件有多个结果的情况。它把多重 else if…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…

单片机通信协议(1):SPI简介

关于SPI SPI&#xff08;串行外设接口&#xff09;是板载设备间通信接口之一。它是由摩托罗拉公司&#xff08;飞思卡尔半导体&#xff09;推出的。由于其简单性和通用性&#xff0c;它被纳入各种外围设备中&#xff0c;并与飞利浦I2C总线并列。 SPI的三线或四线信号数量比IIC…

OSPF状态机+SPF算法

OSPF状态机 1.点到点网络类型 down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD 目录后发现不用进行LSA 直接进入ful。若查看后需要进行查询、应答先进入loading&#xff0c;在查询应答完后再进入 fuIl: 2.MA网络类型 down --&g…

【C++修行之道】类和对象(三)拷贝构造函数

目录 一、 概念 二、特征 正确的拷贝构造函数写法&#xff1a; 拷贝函数的另一种写法 三、若未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了&#xff0c;还需要自己显式实现吗&#xff1f; 深拷…

Transformer 动画讲解:数据处理的四大关键步骤

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述

读《Diffusion Models: A Comprehensive Survey of Methods and Applications》综述 关于此文&#xff0c;我的一个见解想法&#xff0c;重点关注他怎么描述 「Diffusion Model」的引用的&#xff0c;以及未来方向就好了。当然从这篇文章可以知道 「Diffusion Model」的一个基石…

【哈希】用哈希桶封装unordered_map unordered_set

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 用哈希桶封装 unordered_map & unordered_set 的相关内容。 如…

Linux系统使用Docker安装Drupal结合内网穿透实现远程访问管理后台

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux系统使用Docker安装Drupal…

python在cmd中运行.exe文件时报错:不是内部或外部命令,也不是可运行的程序或批处理文件。的解决办法

添加系统环境变量&#xff1a; 设置环境变量&#xff0c;在用户变量里面添加 【PATH&#xff1a;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Windows\SysWOW64】 在系统变量里面添加,【变量名&#xff1a;ComSpec】 【变量值&#xff1a;%SystemRoo…

ROS2从入门到精通2-1:launch多节点启动与脚本配置

目录 0 专栏介绍1 ROS2的启动脚本优化2 ROS2多节点启动案例2.1 C架构2.2 Python架构 3 其他格式的启动文件3.1 .yaml启动3.2 .xml启动 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的…

适合能源企业的文档安全外发系统应该是什么样的?

能源企业是市场经济中的重要组成&#xff0c;也是社会可持续长远发展的关键组成之一&#xff0c;能源行业在开拓新能源业务线、提升产能的日常经营中&#xff0c;也需要与外部合作伙伴、客户间进行密切的业务往来&#xff0c;文档可能涉及多个领域多个类型。 能源供应合同&…

IDEA2023.2单击Setting提示报错:Cannot get children Easy Code

1、单击Setting&#xff0c;不能弹出对话框 2、打开IDE Internal Errors发生错误 原因&#xff1a; 报错信息 "Cannot get children Easy Code" 通常指的是 IntelliJ IDEA 在尝试访问或操作 Easy Code 插件的子设置时遇到了问题。 主要检查是有网络&#xff08;断断…

【排序算法】选择排序以及需要注意的问题

选择排序的基本思想&#xff1a;每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 第一种实现方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决

记录更新Android Studio版本及适配Android V应用配置的一些过程问题。 安装包&#xff1a;android-studio-2024.1.1.6-windows.exe原版本&#xff1a;Android Studio23.2.1.23 Koala 安装过程 Uninstall old version 不会删除原本配置&#xff08;左下角提示&#xff09; Un…

数据结构第二篇【关于java线性表(顺序表)的基本操作】

【关于java线性表&#xff08;顺序表&#xff09;的基本操作】 线性表是什么&#xff1f;&#x1f435;&#x1f412;&#x1f98d;顺序表的定义&#x1f9a7;&#x1f436;&#x1f435;创建顺序表新增元素,默认在数组最后新增在 pos 位置新增元素判定是否包含某个元素查找某个…

如何解决研发数据传输层面安全可控、可追溯的共性需求?

研发数据在企业内部跨网文件交换&#xff0c;是相对较为普遍而频繁的文件流转需求&#xff0c;基于国家法律法规要求及自身安全管理需要&#xff0c;许多企业进行内部网络隔离。不同企业隔离方案各不相同&#xff0c;比如银行内部将网络隔离为生产网、办公网、DMZ区&#xff0c…