《Java基础 聊天窗口案例:剖析 GUI、文件 I/O 等关键技术知识》

1. 面向对象编程

  • 类与对象:代码中定义了 Chat 类,它是整个程序的核心,封装了与聊天窗口相关的属性和方法。在 main 方法中创建了 Chat 类的对象,并调用其方法来完成相应的功能。
  • 继承与多态ButtonClickListener 类实现了 ActionListener 接口,这是一种多态的体现。通过实现接口,ButtonClickListener 类可以作为 ActionListener 类型来使用,使得按钮能够注册该监听器以处理点击事件。
  • 内部类ButtonClickListenerChat 类的内部类,它可以直接访问外部类 Chat 的成员变量和方法,这有助于代码的组织和封装,同时也能方便地处理与外部类相关的事件。

2. 图形用户界面(GUI)编程

  • Swing 库:代码使用了 Java 的 Swing 库来创建图形用户界面。JFrame 用于创建窗口,JButton 用于创建按钮,JTextArea 用于创建文本区域。这些组件都是 Swing 库提供的,通过组合它们可以构建出丰富的 GUI 界面。
  • 布局管理器:使用 FlowLayout 作为窗口的布局管理器,它会按照组件添加的顺序从左到右、从上到下排列组件,这是一种简单且常用的布局方式。
  • 事件处理:通过实现 ActionListener 接口,为按钮添加点击事件监听器。当用户点击按钮时,会触发 actionPerformed 方法,在该方法中可以编写相应的处理逻辑,如发送消息、保存文件和关闭窗口等。

3. 文件操作

  • 文件类:使用 File 类来表示文件和目录,通过 File 对象可以对文件进行创建、删除、重命名等操作。在代码中,使用 File 类创建了一个表示 job\\out.txt 文件的对象。
  • 文件输出流FileOutputStream 用于将数据写入文件。代码中使用 FileOutputStream 将聊天记录文本内容写入到指定的文件中,涉及到字节流的操作,需要将字符串转换为字节数组后再写入文件。

4. 异常处理

  • try-catch:在代码中使用了 try-catch 块来捕获和处理可能出现的异常。例如,在 initChatWindow 方法中捕获 IOException,以处理文件操作可能出现的输入输出异常;在 saveTextToFile 方法中也捕获了 IOException,确保在文件写入过程中出现异常时程序不会崩溃,并打印异常信息方便调试。

5. 基本数据类型和字符串处理

  • 字符串操作:在处理聊天记录和输入内容时,使用了字符串类型。例如,通过 getText 方法从 JTextArea 中获取文本内容,使用 append 方法将文本追加到 JTextArea 中,还将字符串转换为字节数组以便写入文件。

6. 静态方法和入口点

  • main 方法main 方法是 Java 程序的入口点,程序从这里开始执行。它是一个静态方法,不需要创建对象就可以直接调用,通常用于初始化程序和调用其他方法。
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;/*** 这是一个简单的聊天窗口程序,使用 Java 的 Swing 库创建图形用户界面。* 该程序包含一个聊天窗口,用户可以在输入框输入内容,点击发送按钮将内容添加到聊天记录中,* 点击关闭按钮会将聊天记录保存到文件并关闭程序。*/
public class Chat {/*** 程序的入口点,创建 Chat 类的实例并调用初始化聊天窗口的方法。* @param args 命令行参数,在本程序中未使用。*/public static void main(String[] args) {try {// 创建 Chat 类的实例并调用初始化聊天窗口的方法new Chat().initChatWindow();} catch (IOException e) {// 捕获并打印可能出现的输入输出异常e.printStackTrace();}}// 定义聊天窗口,使用 JFrame 类创建一个可视化窗口JFrame chatWindow = new JFrame("QQ");// 定义发送按钮,点击该按钮可将输入的内容添加到聊天记录中JButton sendButton = new JButton("发送");// 定义关闭按钮,点击该按钮会将聊天记录保存到文件并关闭程序JButton closeButton = new JButton("关闭");// 定义显示聊天记录的文本区域,用户发送的内容会显示在这里JTextArea chatHistoryTextArea = new JTextArea(10, 35);// 定义输入聊天内容的文本区域,用户可以在此输入要发送的信息JTextArea inputTextArea = new JTextArea(5, 35);/*** 初始化聊天窗口界面,设置窗口大小、布局,添加组件并设置可见性。* @throws IOException 如果在操作文件时发生输入输出异常。*/public void initChatWindow() throws IOException {// 设置聊天窗口的大小为 400x480 像素chatWindow.setSize(400, 480);// 设置窗口的布局管理器为 FlowLayout,组件按从左到右、从上到下的顺序排列chatWindow.setLayout(new FlowLayout());// 设置显示聊天记录的文本区域背景颜色为绿色chatHistoryTextArea.setBackground(Color.GREEN);// 设置输入聊天内容的文本区域背景颜色为浅灰色inputTextArea.setBackground(Color.lightGray);// 为发送按钮添加点击事件监听器,当按钮被点击时会触发相应的操作sendButton.addActionListener(new ButtonClickListener());// 为关闭按钮添加点击事件监听器,当按钮被点击时会触发相应的操作closeButton.addActionListener(new ButtonClickListener());// 将显示聊天记录的文本区域添加到聊天窗口中chatWindow.add(chatHistoryTextArea);// 将输入聊天内容的文本区域添加到聊天窗口中chatWindow.add(inputTextArea);// 将发送按钮添加到聊天窗口中chatWindow.add(sendButton);// 将关闭按钮添加到聊天窗口中chatWindow.add(closeButton);// 设置窗口大小不可调整chatWindow.setResizable(false);// 设置窗口可见,使窗口显示在屏幕上chatWindow.setVisible(true);}/*** 将指定的文本内容保存到文件中。* @param textToSave 要保存到文件的文本内容。*/public void saveTextToFile(String textToSave) {try {// 创建一个文件对象,指定文件路径为 job\\out.txtFile outputFile = new File("job\\out.txt");// 创建一个文件输出流,用于将数据写入到指定文件中FileOutputStream fileOutputStream = new FileOutputStream(outputFile);// 将文本内容转换为字节数组并写入到文件输出流中fileOutputStream.write(textToSave.getBytes());// 刷新文件输出流,确保所有缓冲的数据都被写入到文件中fileOutputStream.flush();// 关闭文件输出流,释放相关资源fileOutputStream.close();} catch (IOException e) {// 捕获并打印可能出现的输入输出异常e.printStackTrace();}}/*** 按钮点击事件监听器类,实现了 ActionListener 接口,用于处理按钮的点击事件。*/class ButtonClickListener implements ActionListener {/*** 处理按钮点击事件,根据点击的按钮执行相应的操作。* @param e 按钮点击事件对象,包含了事件的相关信息。*/public void actionPerformed(ActionEvent e) {// 打印调试信息System.out.println("hdj");// 判断点击的是否是发送按钮if (e.getSource() == sendButton) {// 如果是发送按钮,将输入文本区域的内容追加到聊天记录文本区域中chatHistoryTextArea.append(inputTextArea.getText());// 清空输入文本区域,以便用户输入新的内容inputTextArea.setText("");}// 判断点击的是否是关闭按钮if (e.getSource() == closeButton) {// 如果是关闭按钮,调用保存文本到文件的方法,将聊天记录保存到文件中saveTextToFile(chatHistoryTextArea.getText());// 退出程序,关闭整个应用程序System.exit(0);}}}
}

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

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

相关文章

IDE集成开发环境MyEclipse中安装SVN

打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后,会刷新出两个选项,需要选中的 点击next,出现许可的时候选中同意,一直结束等…

归并排序:分治哲学的完美演绎与时空平衡的艺术

引言:跨越世纪的算法明珠 在计算机科学的璀璨星河中,归并排序犹如一颗恒久闪耀的明星。1945年,现代计算机之父冯诺伊曼在EDVAC计算机的研发过程中首次系统性地提出了这一算法,其精妙的分治思想不仅奠定了现代排序算法的理论基础&…

服务器CPU微架构

1、微架构图 前端:预解码、解码、分支预测、L1指令缓存、指令TLB缓存 后端:顺序重排缓存器ROB处理依赖,调度器送到执行引擎 执行引擎:8路超标量,每一路可以进行独立的微操作处理 Port0、1、5、6支持整数、浮点数的加…

SpringBoot调用DeepSeek

引入依赖 <dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.4.5</version> </dependency>配置 deepseek:api-key: sk-******base-url: https://api.…

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…

OpenMCU(一):STM32F407 FreeRTOS移植

概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中&#xff0c;忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程&#xff0c;该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…

NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo

NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo创建一个基于CIFLog平台的应用系统1. 下载安装CIFLog2. 授权使用3. 解决本地机器码验证错误问题4. 创建一个基于CIFLog平台的应用系统&#xff08;1&#xff09;新建项目&#xf…

ESP8266连接网络实时上传数据

要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…

pytest中pytest.ini文件的使用

pytest.ini 是 pytest 测试框架的配置文件,它允许你自定义 pytest 的行为。通过在 pytest.ini 中设置各种选项,可以改变测试用例的发现规则、输出格式、插件行为等。以下详细介绍 pytest.ini 文件的使用。 1. 文件位置 pytest.ini 文件通常位于项目的根目录下,pytest 在运…

MARL零样本协调之Fictitious Co-Play学习笔记

下列引用来自知乎作者Algernon 知乎link FCP作为ZSC领域两阶段训练方法的开创者 论文《Collaborating with Humans without Human Data》来自 NeurIPS 2021。这篇论文提出 Fictitious Co-Play (FCP) 来解决 ZSC 问题。论文认为&#xff0c;ZSC 的第一个重要问题是对称性&#x…

Docker小游戏 | 使用Docker部署DOS游戏合集

Docker小游戏 | 使用Docker部署DOS游戏合集 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署dos-games网页小游戏下载镜像创建容器检查容器状态检查服务端口检查容器日志安全设置四、访问DOS游戏网页五、进阶玩法下载游戏拷贝…

SpringBoot-模拟SSE对话交互

SpringBoot-模拟SSE对话交互 后端使用SSE进行会话&#xff0c;前端使用Html模拟大模型的问答交互->【前端】【后端】 1-学习目的 本项目代码仓库&#xff1a;https://gitee.com/enzoism/springboot_sse 1-核心知识点 1&#xff09;什么是SSE协议->客户端发起一次请求&am…

2025 ubuntu24.04系统安装docker

1.查看ubuntu版本&#xff08;Ubuntu 24.04 LTS&#xff09; rootmaster:~# cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubun…

Avalonia 中文乱码

代码字体文件设置成支持中文的&#xff0c;但是编译的代码还是显示的乱码&#xff0c;原因是代码文件的文件编码格式不支持中文导致的。 如下面的2个页面一部分中文显示正常&#xff0c;一部分显示正常&#xff0c;一部分显示乱码。

国产编辑器EverEdit - 工具栏自定义及认识工具栏上的按钮

1 设置-高级-工具条 1.1 设置说明 1.1.1 工具条自定义 选择主菜单工具 -> 设置 -> 常规&#xff0c;在弹出的选项窗口中选择工具条分类&#xff0c;如下图所示&#xff1a; 左侧窗口是当前支持所有功能按钮列表(上图中居中栏)&#xff0c;右侧的窗口是当前显示在工具栏…

淘宝商品详情高级版API接口测试与数据处理指南

在电商数据分析、商品监控和自动化运营中&#xff0c;淘宝商品详情API接口是不可或缺的工具之一。本文将详细介绍如何测试淘宝商品详情高级版API接口的返回数据&#xff0c;并提供完整的数据处理流程&#xff0c;帮助开发者高效利用接口数据。 一、淘宝商品详情API接口概述 淘…

C++海康相机DEMO

非标设备经常用到相机算法&#xff0c;利用工作之余时间&#xff0c;结合海康相机demo写一套全面的相机应用&#xff0c;图像处理常用的有halcon 、 opencv &#xff0c; MIL &#xff0c; visionpro&#xff0c;这里采用目前比较常用的halcon和opencv对相机图片算法处理。整个…

TMS320F28P550SJ9学习笔记2:Sysconfig 配置与点亮LED

今日学习使用Sysconfig 对引脚进行配置&#xff0c;并点亮开发板上的LED4 与LED5 我的单片机开发板平台是 LAUNCHXL_F28P55x 我是在上文描述的驱动库C2000ware官方例程example的工程基础之上进行添加功能的 该例程路径如下&#xff1a;D:\C2000Ware_5_04_00_00\driverlib\f28p…

人机交互革命:从触屏到脑波的13维战争

人机交互革命&#xff1a;从触屏到脑波的13维战争 一、交互维度大爆炸&#xff1a;重新定义人机沟通边界 当ChatGPT开始解析你的微表情&#xff0c;当Neuralink芯片能读取皮层信号&#xff0c;人机交互已突破【键鼠】的次元壁。我们正经历人类史上最大规模的感官革命&#xff…

使用Qt调用HslCommunication(C++调用C#库)

使用C/CLI 来调用C#的dll 任务分解&#xff1a; 1、实现C#封装一个调用hsl的dll&#xff1b; 2、实现C控制台调用C#的dll库&#xff1b; 3、把调用C#的dll用C再封装为一个dll&#xff1b; 4、最后再用Qt调用c的dll&#xff1b; 填坑&#xff1a; 1、开发时VS需要安装CLI项目库…