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

news2024/11/24 23:02:37

一、前言

记录时间 [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/

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

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

相关文章

禁用USB端口的办法,哪一种禁用USB端口的方法好

禁用USB端口的办法,哪一种禁用USB端口的方法好 禁用USB端口是保护公司数据安全的一种常见做法,旨在防止未经授权的数据传输和潜在的恶意软件传播。以下是几种常见的禁用USB端口方法及其效果评价。 1、硬件方法: BIOS设置:通过BIO…

ICH指导原则数据库

ICH人用药品技术要求国际协调理事会,英文全称为"The International Council for Harmonisation of Technical Requirements for Pharmaceuticals for Human Use"。 ① ICH简介 于1990年由欧、美、日三方政府监管发起的一个国际非盈利组织,依…

L1527射频编码芯片 百万组通用编码器,可替代EV1527

L1527 是CMOS 结构的预烧内码(遥控中的地址码)通用编码器,内有 20 位可预烧写 100 万组内码组合,使得重码率很低,具有更高安全性。芯片内集成误操作禁止功能,在按键输入有效且状态不变时,芯片连…

kaggle竞赛系列基于图像对水稻分类代码案例

目录 依赖环境 代码 导入依赖包 定义数据集路径: 创建训练集、验证集和测试集的文件夹: 代码的作用: 设置新的数据集路径与类别名称 代码的作用: 定义数据预处理和增强变换: 代码的作用: 定义数…

C语言 | Leetcode C语言题解之第122题买卖股票的最佳时机II

题目&#xff1a; 题解&#xff1a; int maxProfit(int* prices, int pricesSize) {int ans 0;for (int i 1; i < pricesSize; i) {ans fmax(0, prices[i] - prices[i - 1]);}return ans; }

FPGA DMA IP核使用指南

摘要 本文旨在介绍FPGA中DMA(Direct Memory Access)IP核的使用,包括其基本框架、测试代码编写以及仿真波形的分析。DMA是一种允许外围设备直接与内存进行数据交换的技术,无需CPU的介入,从而提高了数据传输的效率。 1. 引言 在现代FPGA设计中,DMA IP核因其…

一站式链路追踪:阿里云的端到端解决方案

作者&#xff1a;涯海 炎炎夏日&#xff0c;当你打开外卖 APP 购买奶茶却发现下单失败&#xff1b;五一佳节&#xff0c;当你自驾游途中发现导航响应缓慢&#xff0c;频繁错过路口&#xff1b;深更半夜&#xff0c;当你辅导孩子功课&#xff0c;却发现 GPT 应用迟迟无法应答。…

【VTKExamples::Utilities】第十七期 ZBuffer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ZBuffer,并解析接口vtkWindowToImageFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

一个案例告诉你,MySQL如何查询今天、昨天、近7天、近30天、本月、上个月、本季度、上季度、本年、上一年数据

参考博客 mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据 正文内容 创建测试案例&#xff08;也可直接使用附录MySQL脚本生成数据&#xff09; 1、新建测试表 CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,date_column DATE,d…

无信号、弱信号地区的“关键先生”,北三区域短报文应急通信——户外应急救援的安全保障

随着中国经济高速发展和民众生活水平、文化素养的不断提高&#xff0c;户外探险活动已经成为越来越多民众自主选择的一种休闲生活方式。 然而&#xff0c;产业发展和参与人数激增的同时户外探险事故也不断增多。根据中国探险协会发布《2022年度中国户外探险事故报告》显示2022…

跨境电商站外推广全攻略:揭秘有效推广方法!

随着全球贸易的蓬勃兴起&#xff0c;越来越多的企业开始涉足跨境电商领域。然而&#xff0c;要在国际市场上取得成功&#xff0c;仅仅依赖平台内的推广策略是远远不够的。站外推广成为了跨境电商拓展业务、吸引潜在客户的关键策略。那么&#xff0c;跨境电商的站外推广具体包括…

计算机组成原理·海明编码及其实验

前言&#xff1a;海明编码这一块在刚开始的时候没有弄懂&#xff0c;后面通过做实验、复习慢慢摸清了门道。在学习计算机组成原理的过程中&#xff0c;实验实践是很重要的&#xff0c;它会让你去搞清楚事情背后的原理&#xff0c;逼着你学会你没听懂的东西。这篇文章会从海明码…

Vue3实战笔记(53)—奇怪+1,VUE3实战模拟股票大盘工作台

文章目录 前言一、实战模拟股票大盘工作台二、使用步骤总结 前言 实战模拟股票大盘工作台 一、实战模拟股票大盘工作台 接上文&#xff0c;这两天封装好的组件直接应用,上源码&#xff1a; <template><div class"smart_house pb-5"><v-row ><…

做外贸,怎么选国外服务器?

不管是新手还是外贸老司机&#xff0c;大家都知道要用海外服务器来做外贸网站&#xff0c;无论外贸独立站的客户是欧美、东南亚、还是非洲&#xff0c;都不能选择国内机房的服务器&#xff0c;必须选择海外服务器&#xff0c;这是共识。 但是今天&#xff0c;我要告诉大家一个…

关联规则(Apriori算法)

文章目录 1 关联规则1.1 关联规则简介1.2 典型例子1.3 频繁项集的评估标准1.3.1 支持度&#xff08;support&#xff09;1.3.2 置信度&#xff08;confidence&#xff09;1.3.3 提升度&#xff08;lift&#xff09; 1.4 最小支持度、最小置信度 2 Python实战2.1 Python实战关联…

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…

STL:vector

文章目录 标准库中的vectorvector的构造vector的迭代器vector的容量vector的元素访问data vector的修改 vector和string的迭代器失效问题resize、reserve、insert、push_back、assigneraseg 和 vs 的区别string解决迭代器失效的方法 标准库中的vector vector是表示可变大小数组…

【学习Day3】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.5.4 Cache替换算法 Cache的页面淘汰算法 常用替换算法有&#xff1a; • 随机替换算法RA…

浏览器【详解】Cookie(含Cookie的起源,属性,个数和大小限制,作用,优点,缺点,JS 的操作方法等)

什么是 Cookie &#xff1f; Cookie 是一段不超过 4KB 的小型文本数据&#xff0c;由一个名称&#xff08;Name&#xff09;、一个值&#xff08;Value&#xff09;和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。 浏览器为什么需要 Cookie &#xff1f; …