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 height
        frame.setSize(400, 400);

        // 设置背景颜色 Color
        frame.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));

        // 设置背景颜色 Color
        setBackground(color);

        // 弹出的初始位置 x y
        // 设置窗口大小 width height
        setBounds(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 设置坐标,坐标相对于 frame
        panel.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() {

    // 窗口点击关闭的时候需要做的事情
    @Override
    public 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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django——Admin站点(Python)

#前言: 该博客为小编Django基础知识操作博客的最后一篇,主要讲解了关于Admin站点的一些基本操作,小编会继续尽力更新一些优质文章,同时欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。 一、简介: Djan…

【Spring Cloud】微服务日志收集系统-ELK+Kafka

目录 任务背景本文相关文件资料Elasticsearch特性 LogstashKibanaELKELK的缺点引入消息中间件 ELKKafkaKafka概念 ELKKafka环境搭建1.将安装素材上传至服务器 cd /usr/local/soft2.防止Elasticsearch因虚拟内存问题启动失败3.创建镜像li/centos7-elasticsearch4.创建容器5.验证…

编译安装PHP服务(LAMP3)

目录 1.初始化设置,将安装PHP所需软件包传到/opt目录下 (1)关闭防火墙 (2)上传软件包到/opt目录 2.安装GD库和GD库关联程序,用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

先导微型数控桌面式加工中心

随着数控技术、传感器技术、人工智能等技术的不断发展,制造业的快速发展和技术的不断进步,小型五轴加工中心的性能将不断提升,五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段,使其具有更广泛的应用前景。小型五轴加…

【康耐视国产案例】智能AI相机:深度解析DataMan 380大视野高速AI读码硬实力

随着读码器技术的不断更新迭代,大视野高速应用成为当前工业读码领域的关键发展方向。客户对大视野高速读码器的需求源于其能显著减少生产成本并提升工作效率。然而,大视野应用场景往往伴随着对多个条码的读取需求,这无疑增加了算法的处理负担…

Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题; 2、支持录屏操…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…

从Socket到WebSocket

前言 不知道大家在学习网络编程的时候都是怎样的一种方式,我谨以此文章来记录我自己从头开始学习C网络编程时的经历,中间有许多我自己的一些想法和思考。当然作为一个刚开始学习的新手来说,有些内容也许不那么正确,只是代表了我在…

flink 操作mongodb的例子

简述 该例子为从一个Collection获取数据然后插入到另外一个Collection中。 Flink的基本处理过程可以清晰地分为以下几个阶段: 数据源(Source): Flink可以从多种数据源中读取数据,如Kafka、RabbitMQ、HDFS等。Flink会…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章:Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊:Nature Communications(影响因子:16.6) 发表时间:2024/3/29 作 者&#xff1…

基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生综…

vivado 时序约束

时间限制 以下ISE设计套件时序约束可以表示为XDC时序约束 Vivado设计套件。每个约束描述都包含一个UCF示例和 等效的XDC示例。 在未直接连接到边界的网络上创建时钟时,UCF和XDC不同 的设计(如端口)。在XDC中,当在上定义带有create…

LwIP 之十 详解 TCP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 TCP RAW 编程则是指的直接使用 LwIP 的最底层 TCP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

【JS重点知识02】栈、堆与数据类型 关系

一:栈堆空间分配区别: 1 栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 简单数据类型存放在栈中 2 堆:存储复杂数据类型(对象),…

C#知识|通用数据访问类SQLHelper的编写

哈喽,你好啊,我是雷工! 前面学习了C#操作SQLServer数据库数据的增删改查, 《C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。》 其中实现的过程中有很多代码是重复的,此时作为高阶程序员为了使代码更优雅,避免重复, 从而要考虑代码的复用技术,针对此案例中代…

vscode 编程工具配置Java开发环境

vs code 开发环境配置。 环境准备: 1. 安装JDK/安装maven/安装vs code 首先安装好vs code 之后,需要安装 Extension Pack for Java 这么个插件 配置maven,进入setting, 3:配置 maven安装目录,4&#xff1a…

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 📒1. 引言📒2. 多种机器学习算法的应用📒3. 机器学习在股票价格预测中的应用现状🎉数据收集与预处理🎉模型构建与训练🌈模型评估与预测🌞模型评估🌙模型预测⭐注意事项 &…

msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法

在使用电脑时是不是遇到过关于msvcp100.dll丢失文件丢失的情况?出现这样的情况有什么办法可以将丢失的msvcp100.dll文件快速恢复?今天的这篇文章就将教大家几种能够有效的解决msvcp100.dll丢失问题的方法。 方法一:重启电脑 重启电脑是一种简…

sqliteSQL基础

SQL基础 SQLite 数据库简介 SQLite 是一个开源的、 内嵌式的关系型数据库, 第一个版本诞生于 2000 年 5 月, 目前最高版本为 SQLite3。 下载地址: https://www.sqlite.org/download.html 菜鸟教程 : https://www.runoob.com/sqlite/sqlit…

项目VS运营

一、项目与运营的定义与区别 项目与运营是企业管理中的两个重要概念,尽管在实际运作中它们常被视为同义词,但它们之间存在明显的区别。 项目,指的是为达到特定目标,通过临时性、系统性、有计划的组织、协调、控制等系列活动&…