Java程序设计——GUI设计
一、目的
通过用户图形界面设计,掌握JavaSwing开发的基本方法。
二、实验内容与设计思想
实验内容:
课本验证实验:
Example10_6

图 1
Example10_7

图 2

图 3
Example10_15

图 4
设计思想:
①学生信息管理系统:
※结果截图:

图 5 窗口效果图

图 6 写入学生信息

图 7 写入学生信息成功

图 8 输入查询学生的ID

图 9 查询成功

图 10 存储学生信息的文件

图 11 加载学生信息成功

图 12 输入查询加载后学生的ID

图 13 查询成功

图 14 输入不存在的学生ID(异常处理)
※设计思路:
1、该应用程序通过一个图形用户界面(GUI)允许用户输入和查看学生信息。
2、用户可以通过"Save"按钮保存输入的学生信息,"Load"按钮加载已保存的学生信息,"Query"按钮3、查询特定学生信息。
4、学生信息包括ID,姓名,年龄,专业,以及性别。
5、为了实现对学生信息的存储和查询,程序使用了Java中的HashMap数据结构。
※主要代码结构:
1、在StudentInfoGUI构造函数中,初始化组件并添加事件监听器。
2、定义三个按钮:“Save”,“Load”和“Query”,并为每个按钮添加一个动作监听器。
3、定义一个JPanel并添加组件以显示学生信息。
4、定义三个私有方法:saveStudentInfo(), loadStudentInfo() 和 queryStudentInfo()。这些方法处理按钮的点击事件。
5、在主窗口中显示所有组件。
※主要代码段的文字分析:
1、JTextField idField, nameField, ageField, majorField;:这些是用于输入学生信息的文本框。
2、JCheckBox maleCheckBox, femaleCheckBox;:这些是用于选择学生性别的复选框。
3、JTextArea outputArea;:这是一个文本区域,用于显示输出信息。
4、Map<String, Student> students;:这是一个HashMap,用于存储学生信息。键是一个字符串(学生的ID),值是一个Student对象。
5、saveButton.addActionListener(new ActionListener() {...});:为"Save"按钮添加一个动作监听器,当点击该按钮时,调用saveStudentInfo()方法。
6、loadButton.addActionListener(new ActionListener() {...});:为"Load"按钮添加一个动作监听器,当点击该按钮时,调用loadStudentInfo()方法。
7、queryButton.addActionListener(new ActionListener() {...});:为"Query"按钮添加一个动作监听器,当点击该按钮时,调用queryStudentInfo()方法。
8、JPanel panel = new JPanel(new GridLayout(7, 2));:创建一个新的JPanel并设置其布局为7行2列的网格布局。
9、panel.add(new JLabel("ID:")); panel.add(idField);:向面板添加标签和文本框以输入学生ID。
10、panel.add(new JLabel("Name:")); panel.add(nameField);:向面板添加标签和文本框以输入学生姓名。
11、panel.add(new JLabel("Age:")); panel.add(ageField);:向面板添加标签和文本框以输入学生年龄。
12、panel.add(new JLabel("Major:")); panel.add(majorField);:向面板添加标签和文本框以输入学生专业。
三、实验使用环境
Eclipse集成开发环境
四、实验小结
一、实验中遇到的问题及解决过程
在本次实验中,我遇到了以下几个问题:
- 对题目理解不准确:在实验初期,由于没有仔细审题,导致我对实验任务的要求理解不准确。后来通过与同学和老师交流,我逐渐明确了实验任务的目标和要求。
2.代码逻辑错误:在编写代码的过程中,我发现自己的代码逻辑有错误,导致程序无法正常运行。经过仔细排查和调试,最终找到了问题所在并进行了修复。
3.技术难点:在实验过程中,我遇到了一些技术难点,比如如何使用Java中的多线程等。通过查阅相关资料和请教同学,我逐渐掌握了这些技术难点。
二、实验中产生的错误及原因分析
在实验中,我主要出现了以下几个错误:
1.语法错误:在编写代码的过程中,由于疏忽大意,导致出现了语法错误。这些错误在编译阶段就被发现并及时修复。
2.逻辑错误:由于代码逻辑复杂,我在编写代码的过程中出现了逻辑错误。这些错误在测试阶段被发现,并通过调试进行了修复。
3.运行错误:由于环境配置问题或者代码本身的问题,导致程序在运行时出现了错误。这些错误通过仔细排查和调试得到了解决。
三、实验体会和收获
通过本次实验,我获得了以下体会和收获:
1.仔细审题:在实验开始前,一定要仔细审题,明确实验任务的目标和要求。这样可以避免在实验过程中走弯路。
2.多交流:在实验过程中,要多与同学和老师交流,共同解决问题。这样可以拓宽自己的思路,学到更多的知识。
3.善于总结:在实验结束后,要善于总结自己的实验结果和经验教训。这样可以加深对知识的理解和记忆,为以后的实验打下良好的基础。
四、结论
通过本次Java程序设计实验,我深入了解了Java语言的基本特性和编程方法,掌握了多线程等复杂技术的使用方法。虽然在实验过程中遇到了一些问题和挫折,但通过不断地学习和探索,我最终成功地完成了实验任务。这次实验让我更加深刻地认识到编程的复杂性和挑战性,同时也让我更加坚定了自己学习编程的决心和信心。我相信在未来的学习和工作中,我会更加努力地学习和掌握更多的编程知识和技能。
五、参考文献
[1]耿祥义,张跃平,Java面向对象程序设计(第3版) ,清华大学出版社,2020
六、源代码附件
第一题:
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class StudentInfoGUI extends JFrame {
private JTextField idField, nameField, ageField, majorField;
private JCheckBox maleCheckBox, femaleCheckBox;
private JTextArea outputArea;
private Map<String, Student> students;
public StudentInfoGUI() {
students = new HashMap<>();
idField = new JTextField(10);
nameField = new JTextField(10);
ageField = new JTextField(10);
majorField = new JTextField(10);
maleCheckBox = new JCheckBox("Male");
femaleCheckBox = new JCheckBox("Female");
outputArea = new JTextArea(10, 30);
outputArea.setEditable(false);
JButton saveButton = new JButton("Save");
JButton loadButton = new JButton("Load");
JButton queryButton = new JButton("Query");
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveStudentInfo();
}
});
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loadStudentInfo();
}
});
queryButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
queryStudentInfo();
}
});
JPanel panel = new JPanel(new GridLayout(7, 2));
panel.add(new JLabel("ID:"));
panel.add(idField);
panel.add(new JLabel("Name:"));
panel.add(nameField);
panel.add(new JLabel("Age:"));
panel.add(ageField);
panel.add(new JLabel("Major:"));
panel.add(majorField);
panel.add(new JLabel("Gender:"));
panel.add(maleCheckBox);
panel.add(new JLabel(""));
panel.add(femaleCheckBox);
JPanel buttonPanel = new JPanel();
buttonPanel.add(saveButton);
buttonPanel.add(loadButton);
buttonPanel.add(queryButton);
Container container = getContentPane();
container.setLayout(new BorderLayout());
container.add(panel, BorderLayout.CENTER);
container.add(buttonPanel, BorderLayout.SOUTH);
container.add(new JScrollPane(outputArea), BorderLayout.EAST);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 300);
setVisible(true);
}
private void saveStudentInfo() {
String id = idField.getText();
String name = nameField.getText();
int age = Integer.parseInt(ageField.getText());
String major = majorField.getText();
String gender = maleCheckBox.isSelected() ? "Male" : "Female";
Student student = new Student(id, name, age, major, gender);
students.put(id, student);
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("students.dat"))) {
outputStream.writeObject(students);
JOptionPane.showMessageDialog(this, "Student information saved successfully!");
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Error saving student information: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
private void loadStudentInfo() {
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("students.dat"))) {
students = (Map<String, Student>) inputStream.readObject();
JOptionPane.showMessageDialog(this, "Student information loaded successfully!");
} catch (IOException | ClassNotFoundException ex) {
JOptionPane.showMessageDialog(this, "Error loading student information: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
private void queryStudentInfo() {
String id = JOptionPane.showInputDialog(this, "Enter student ID:");
if (students.containsKey(id)) {
Student student = students.get(id);
outputArea.setText(student.toString());
} else {
outputArea.setText("Student not found.");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
StudentInfoGUI win = new StudentInfoGUI();
win.setTitle("学生信息管理系统");
}
});
}
}
class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
private String major;
private String gender;
public Student(String id, String name, int age, String major, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.major = major;
this.gender = gender;
}
@Override
public String toString() {
return "ID: " + id + "\nName: " + name + "\nAge: " + age + "\nMajor: " + major + "\nGender: " + gender;
}
}
相关文章:
Java程序设计——GUI设计
一、目的 通过用户图形界面设计,掌握JavaSwing开发的基本方法。 二、实验内容与设计思想 实验内容: 课本验证实验: Example10_6 图 1 Example10_7 图 2 图 3 Example10_15 图 4 设计思想: ①学生信息管理系统:…...
three.js Raycaster(鼠标点击选中模型)
效果: 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…...
Springboot整合RocketMQ 基本消息处理
目录 1. 同步消息 2. 异步消息 3. 单向消息 4. 延迟消息 5. 批量消息 6. 顺序消息 7. Tag过滤 导入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId></dependency> …...
红外传感器深入解析
引言 宇宙间的任何物体只要其温度超过零度就能产生红外辐射,事实上同可见光一样,其辐射能够进行折射和反射,这样便产生了红外技术,利用红外光探测器因其独有的优越性而得到广泛的重视,并在军事和民用领域得到了广泛…...
18、Kubernetes核心技术 - InitContainer(初始化容器)
目录 一、概述 二、使用InitContainer 一、概述 InitContainer即初始化容器,是 K8S官方为我们提供的一个可以用来判断环境是否已经满足运行 Pod 应用前所需要的条件。 比如我们有一个应用,需要部署到Tomcat环境,那么在部署这个应用Pod之前…...
electron进程通信之预加载脚本和渲染进程对主进程通信
主进程和预加载脚本通信 主进程 mian,js 和预加载脚本preload.js,在主进程中创建预加载脚本, const createWindow () > {// Create the browser window.const mainWindow new BrowserWindow({width: 300,height: 300,// 指定预加载脚本webPreferences: {preload: path.j…...
如何有效使用 .gitignore 文件
在任何使用 Git 的软件项目中,.gitignore 文件都是一个必不可少的工具。它帮助开发者定义哪些文件和目录应该被 Git 忽略,从而保持代码库的整洁和管理的简便性。 什么是 .gitignore? .gitignore 文件是一个文本文件,您可以在其中指…...
大数据毕设分享 flink大数据淘宝用户行为数据实时分析与可视化
文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计:每小时成交量2.2.1 创建 es 结果表, 存放每小时的成交量2.2.2 执行 sql &#x…...
大语言模型训练数据集
大语言模型的数据集有很多,以下是一些常用的: - 中文维基百科:这是一个包含大量中文文本的数据集,可用于训练中文语言模型。 - 英文维基百科:这是一个包含大量英文文本的数据集,可用于训练英文语言模型。 …...
python的课后练习总结4(while循环)
for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行,直到指定的条件不满足为止。 while 条件: 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. i 1while i < 5:print(i)i i 11、使用wh…...
Flink Connector 开发
Flink Streaming Connector Flink是新一代流批统一的计算引擎,它需要从不同的第三方存储引擎中把数据读过来,进行处理,然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器,连接Flink计算引擎跟外界存储系统。Flin…...
Golang leetcode707 设计链表 (链表大成)
文章目录 设计链表 Leetcode707不使用头节点使用头节点 推荐** 设计链表 Leetcode707 题目要求我们通过实现几个方法来完成对链表的各个操作 由于在go语言中都为值传递,(注意这里与值类型、引用类型的而区别),所以即使我们直接在…...
Django和Vue项目运行过程中遇到的问题及解决办法
这是我从CSDN上边买来的一个系统的资源,准备在此基础上改成自己的系统,但是在运行项目这一步上都把自己难为了好几天,经过不断的摸索,终于完成了第一步!!! 如果大家也遇到同样的问题࿰…...
Single-Image Crowd Counting via Multi-Column Convolutional Neural Network
Single-Image Crowd Counting via Multi-Column Convolutional Neural Network 论文背景人群密度方法过去的发展历史早期方法基于轨迹聚类的方法基于特征回归的方法基于图像的方法 Multi-column CNN用于人群计数基于密度图的人群计数通过几何自适应核生成密度图密度图估计的多列…...
el-cascader隐藏某一级的勾选框及vue报错Error in callback for watcher “options“的解决办法
今天用到饿了么的级联选择器时出现了这个报错Error in callback for watcher “options“: “TypeError: Cannot read propertie ‘level‘ of null,因为需求是在不同类型 el-cascader多选的时候默认是可以勾选所有级的选项的,如下图: 包含级联cascader的options、select的…...
2024美赛数学建模思路A题B题C题D题E题F题思路汇总 选题分析
文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间:北京时间2024年2月2日(周五ÿ…...
C++ 常用设计模式
一、工厂模式 from:C开发常用的设计模式及其实现详解 - 知乎 摘抄: 简单工厂、工厂、抽象工厂: 简单工厂需要工厂内部判断,而工厂模式不需要修改工厂类: 抽象工厂: 接上图: 未完待续.........
高性价比的高速吹风机/高速风筒解决方案,基于普冉单片机开发
高速吹风机是近些年非常火的一款产品,快速崛起并颠覆了传统吹风机,高速吹风机也成为了传统吹风机替代的一个大趋势。高速吹风机是利用高转速产生的大风量来快速吹干头发,由于其精巧的外观设计、超低的噪声、出色的干发效果,高速吹…...
toRefs的用法
文章目录 toRefs是什么toRefs的作用以及为什么要用它? toRefs是什么 toRefs 是 Vue 3 Composition API 中的一个函数,它用于将响应式对象转换为普通对象,其中对象的每个属性都是 ref 对象。这是因为在 Vue 3 中,reactive 创建的对…...
MySQL基础篇(三)约束
一、概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 二…...
WeChatExporter终极指南:如何完整备份微信聊天记录并永久保存珍贵回忆
WeChatExporter终极指南:如何完整备份微信聊天记录并永久保存珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 微信聊天记录导出工具WeChatExporter是…...
从WechatRealFriends迁移至WeFriends:解决微信好友管理痛点的完整指南
从WechatRealFriends迁移至WeFriends:解决微信好友管理痛点的完整指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/Wechat…...
C++ 虚表与多态:从源码到汇编的逐步解析
本文基于代码随想录最强八股文给出的 C 源码与对应的 x86-64(System V ABI 风格)反汇编,按“程序运行流程”一步步解释: 对象内存里 vptr(虚表指针) 在哪构造函数如何 写入 vptrAnimal* 指针如何通过 vtabl…...
OpenClaw技能市场盘点:10个Qwen3-32B最佳自动化插件推荐
OpenClaw技能市场盘点:10个Qwen3-32B最佳自动化插件推荐 1. 为什么需要关注OpenClaw技能市场? 去年冬天,当我第一次在本地部署OpenClaw时,最让我惊喜的不是框架本身,而是它背后那个充满可能性的技能市场。作为一个长…...
Arduino轻量级XXH32哈希库:高吞吐低内存嵌入式校验方案
1. XxHash_arduino 库概述 XxHash_arduino 是一个专为 Arduino 平台优化的轻量级哈希算法库,基于 Yann Collet 开发的 xxHash 算法实现。该库于 2022 年 4 月由嵌入式爱好者 atesin 完成移植,采用 GPLv3 许可协议,同时兼容原始 xxHash 的算法…...
保姆级教程:用vLLM V1源码复现官方Demo,手把手调试核心执行循环
深入vLLM V1核心:从源码构建到执行循环全解析 在当今大模型推理领域,效率优化已成为开发者关注的焦点。vLLM作为高性能推理框架的代表,其V1版本通过重构核心架构带来了显著的性能提升。本文将带您从零开始搭建vLLM V1开发环境,通…...
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅 想不想让一段普通的文字,用你指定的声音说出来?比如,用你自己的声音给视频配音,用朋友的声音讲个笑话,或者用某个角色的声音朗读一…...
数字丛林的领地宣言:信息素如何重构机房安全逻辑
在恒温23℃、湿度40%的密闭机房中,服务器嗡鸣与人体代谢正上演一场无声战争。当测试工程师在敏捷冲刺期连续奋战12小时,汗腺分泌的化学物质与臭氧反应形成独特“技术印记”——这不仅是生物学上的领地标记,更是机房安全管理的新隐喻。一、信息…...
Z-Image-Turbo镜像效果展示:孙珍妮LoRA在不同画幅(1:1/4:3/9:16)表现
Z-Image-Turbo镜像效果展示:孙珍妮LoRA在不同画幅(1:1/4:3/9:16)表现 1. 引言:当AI遇见明星肖像生成 你是否曾经想过,用AI技术生成自己喜欢的明星肖像?今天我们要展示的Z-Image-Turbo镜像,正是…...
别再手动调顺序了!用Vue3+Element Plus+Sortable.js给你的表格加个拖拽编辑弹窗(附完整代码)
Vue3Element PlusSortable.js打造高交互表格编辑弹窗实战 后台管理系统开发中,表格数据的顺序调整和字段管理一直是高频痛点。传统方案往往需要反复点击"上移/下移"按钮或填写表单参数,操作繁琐且体验割裂。本文将带你实现一个弹窗内一站式拖…...
